首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 模板中 typename 關鍵字用法詳解

     編輯:關於C++

兩大用途

  1. 模板參數宣告:template <typename T> 與 template <class T> 等價,慣用 typename。
  2. 標示嵌套相依型別:在模板內使用 T::嵌套型別 時,編譯器無法確定是型別還是靜態成員,必須加 typename。

名稱分類

  • 相依名稱:依賴模板參數的名稱(如 T t)。
  • 嵌套相依名稱:類別內的相依名稱(如 T::const_iterator)。
  • 非相依名稱:不依賴模板參數(如 int)。

規則

模板內使用嵌套相依型別名稱時,前方必須加 typename,否則編譯錯誤(need 'typename' before 'T::xxx')。

例外

  • 基類別列表(class Derived : public Base<T>::Nested)不需 typename。
  • 成員初始化列表(Derived() : Base<T>::Nested(val))不需 typename。

程式碼

/* BInsertSort.cpp
 * Created on: 2014.4.17.
 * Author: Spike
 */
#include <iostream>
#include <string>
#include <vector>
using namespace std;

template<typename T>
void print2nd(const T& container) {
    typename T::const_iterator iter(container.begin()); // 必須加 typename
    ++iter;
    int value = *iter;
    cout << value;
}

int main() {
    vector<int> vi = {1,2,3,4,5};
    print2nd(vi); // 輸出 2
    return 0;
}

基類別列表與成員初始化列表示例

struct Number { Number(int x) { cout << "Number = " << x << endl; } };
template<typename T> struct Base { typedef Number Nested; };
template<typename T> class Derived : public Base<T>::Nested { // 無需 typename
public:
    explicit Derived(int x) : Base<T>::Nested(x) { // 無需 typename
        typename Base<T>::Nested temp(7); // 函式內需 typename
    }
};
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved