可能重複:
模板中關鍵字'typename'和'class'的C ++差別 web
在C ++中定義函數模板或類模板時,能夠這樣寫: 函數
template <class T> ...
或者能夠這樣寫: spa
template <typename T> ...
是否有充分理由偏好一個而不是另外一個? code
我接受了最受歡迎(也頗有趣)的答案,但真正的答案彷佛是「不,沒有理由更喜歡一個而不是另外一個。」 blog
typename
。 class
。 但請注意,在模板模板參數的狀況下,在C ++ 17以前,須要使用class
而不是typename
。 請參閱下面的user1428839的答案 。 (但這個特殊狀況不是偏好問題,而是語言的要求。) ip
forced (up to and including C++14) when dealing with parameters, eg: 做爲除了全部上述職位,使用的class
關鍵字強制(直至幷包括C ++ 14)與的參數,例如當處理: get
template <template <typename, typename> class Container, typename Type> class MyContainer: public Container<Type, std::allocator<Type>> { /*...*/ };
在此示例中, typename Container
將生成編譯器錯誤,以下所示: 編譯器
error: expected 'class' before 'Container'
class
來typename
。 typename
對於模板模板參數是非法的,所以爲了保持一致,您應該使用class
: it
template<template<class> typename MyTemplate, class Bar> class Foo { }; // :( template<template<class> class MyTemplate, class Bar> class Foo { }; // :)
擴展DarenW的評論。 io
一旦不接受typename和class很是不一樣,對它們的使用嚴格可能仍然有效。 僅當class真的是類時使用class,而且當它是基本類型時使用typename,例如char 。
確實也接受這些類型而不是typename
template < char myc ='/'>
在這種狀況下,甚至優於typename或class。
想一想其餘人的「暗示」或可理解性。 而且實際上認爲第三方軟件/腳本可能會嘗試使用代碼/信息來猜想模板發生了什麼(考慮swig)。
據我所知,你使用哪個並不重要。 它們在編譯器的眼中是等價的。 使用您喜歡的任何一種。 我一般上課。
Stan Lippman 在這裏談到了這一點 。 我以爲這頗有趣。
簡介 :Stroustrup最初使用class
來指定模板中的類型,以免引入新的關鍵字。 委員會中的一些人擔憂這種關鍵字的超載致使了混亂。 後來,委員會引入了一個新的關鍵字typename
來解決語法歧義,並決定讓它也用於指定模板類型以減小混淆,但爲了向後兼容, class
保持其重載意義。