【42】瞭解typename的雙重意義

Andy Niu發表於2014-01-10

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的修飾符。

相關文章