定義模板時typename和class的區別
阿新 • • 發佈:2019-02-05
在c++Template中很多地方都用到了typename與class這兩個關鍵字,而且好像可以替換,是不是這兩個關鍵字完全一樣呢? 相信學習C++的人對class這個關鍵字都非常明白,class用於定義類,在模板引入c++後,最初定義模板的方法為: template<class T>...... 在這裡class關鍵字表明T是一個型別,後來為了避免class在這兩個地方的使用可能給人帶來混淆,所以引入了typename這個關鍵字,它的作用同 class一樣表明後面的符號為一個型別,這樣在定義模板的時候就可以使用下面的方式了: template<typename T>
按 C++ 標準來說,template<typename T> 用於基礎資料型別,typename 指型別名,T 可以取 char int double 等。
template<class T> 用於類,T 可以取任何類。
但是這裡有一個問題,結構體應該用 typename 還是 class? 結構體肯定不是基礎資料型別,但也不是類。
所以實際情況是,template<class T> 的 T 也可以取基礎資料型別,tempate<typename T> 的 T 也可以取類。
但有一個特例,就是當 T 是一個類,而這個類又有子類(假設名為 innerClass) 時,應該用
template<typename>:typename T::innerClass myInnerObject;
這裡的 typename 告訴 編譯器,T::innerClass 是一個類,程式要宣告一個 T::innerClass 類的物件,而不是宣告 T 的靜態成員,而 typename 如果換成 class 則語法錯誤。