下面是摘自https://zh.cppreference.com/w/cpp/keyword/typename的描述函數
C++中的typename關鍵字常見於模板使用spa
例如:code
1. 代替class關鍵字blog
template < typename T >繼承
這裏typename和class關鍵字的功能同樣,是爲了取代class關鍵字而生,緣由是class用來表明非類類型時有點歧義,例如用class表明struct類型、int、double類型,這樣顯得不三不四。作用域
2. 在模板中獲取變量類型get
示例1:編譯器
1 template <class T> 2 void foo() { 3 typename T::iterator * iter; // typename用於告訴編譯器,T::iterator是一個類型而不是一個變量;不然編譯器可能認爲它是一個乘法操做 4 } 5 6 struct ContainsAType { 7 struct iterator; 8 }; 9 10 foo<ContainsAType>();
示例2:it
typename A<T>::k var; // var變量是A類裏面的k變量的類型,這裏等同於static int var;編譯
const typename A<T>::B& func(); // func()返回值是const A做用域下B類的引用
typedef typename A<T>::B BType; // 給A做用域下的B類 類型取一個別名爲BType
int func(typename A<T>::k var); // func函數的參數是A::k類型(static int)
template < typename T, typename Containter = std::deque<T> > class stack;
上面的四個例子已經表示typename至關於獲取變量的類型
繼承類的列表和參數初始化列表不能出現typename,由於編譯器知道繼承類的列表必須是類型,參數初始化列表必須是變量,例如:
1 template<class T> 2 class Derived: public Base<T>::XXX, public A<T>::YYY // 父類列表,絕對是類型不多是變量 3 { 4 ... 5 } 6 7 Derived(int x, int y) : Base<T>::XXX(x), A<T>::YYY(y) // 參數初始化列表,絕對是變量而不多是類型 8 { 9 ... 10 }