2011-03-15 30 views
20

template <typename T>template <class T>有何區別。 對於我來說,兩者都產生了相同的結果。模板<typename T>與模板<class T>有什麼區別。對我而言,兩者都產生相同的結果

例如

template <class T> 
T Average(T *atArray, int nNumValues) 
{ 
    T tSum = 0; 
    for (int nCount=0; nCount < nNumValues; nCount++) 
     tSum += atArray[nCount]; 

    tSum /= nNumValues; 
    return tSum; 
} 

,如果我將其更改爲template <typename T>這是相同的

+2

[C++:使用'class'或'typename'模板參數?](http://stackoverflow.com/questions/213121/c-use-class-or-typename-for-template-parameters ) – DarenW 2011-08-18 22:16:59

回答

52

沒有區別。 typenameclass在類型模板參數的聲明中是可互換的。

你這樣做,不過,有聲明一個模板的模板參數時使用class(而不是typename):

template <template <typename> class T> class C { }; // valid! 
template <template <typename> typename T> class C { }; // invalid! o noez! 
+3

+1更好的答案。我刪除了我的。 :D – Nawaz 2011-03-15 03:04:43

+6

+1模板模板的使用 – 2011-03-15 04:13:36

+0

@James:我被那個人咬了一口,你知道在這種情況下是否有無效使用'typename'的理由嗎?我認爲'typename'的想法是將'class'保留到新類的聲明/定義中。 – 2011-03-15 07:04:39

1

它們在大部分時間都是等價和可互換的,有些更喜歡typename,因爲在該上下文中使用關鍵字class似乎令人困惑。

爲什麼需要類型名稱的原因是爲那些不確定的情況下使用template <class T>例如,當你像這樣定義的模板:

template <class T> 
void MyMethod() { 
    T::iterator * var; 
} 

,然後由於某種原因,你的模板的用戶決定將類實例因爲這個

class TestObject { 
    static int iterator; //ambiguous 
}; 

MyMethod<TestObject>(); //error 

它變得模棱兩可var var應該是一個類迭代器的實例或靜態類型int。因此,對於這種情況,typename被引入來強制模板對象被解釋爲一種類型。

相關問題