1、在template宣告中,class與typename是等價的,但是使用typename更好。
2、在template實現中,模版形參是從屬名稱,巢狀在模版形參中的型別是巢狀從屬名稱,不依賴任何template引數的名稱,稱為非從屬名稱。
3、巢狀從屬名稱,可能會導致解析困難,出現二義性。比如:C::const_iterator* x; 有兩種意思。一是:模版形參C中有個靜態欄位const_iterator,然後計算它與x的乘積;二是:模版形參C中有個巢狀型別const_iterator,定義指向它的指標。預設情況下,C++編譯器按第一種意思解釋,也就是說,把它當成靜態欄位,而不是型別。如果我想告訴編譯器,這是個巢狀型別,該怎麼辦?使用typename C::const_iterator* x;
4、typename必須作為巢狀從屬型別名稱的字首詞,有兩個例外情況:
1 template <typename T> 2 class Derived:public Base<T>::Nested //不能使用typename 3 { 4 public: 5 explicit Derived(int x):Base<T>::Nested(x) //不能使用typename 6 { 7 typename Base<T>::Nested temp; //必須使用typename 8 9 } 10 }
也就是,不能在基類列,或者成員初始化列,以typename作為base class的修飾符。