使用'class'或'typename'做爲模板參數? [重複]

可能重複:
模板中關鍵字'typename'和'class'的C ++差別 web

在C ++中定義函數模板或類模板時,能夠這樣寫: 函數

template <class T> ...

或者能夠這樣寫: spa

template <typename T> ...

是否有充分理由偏好一個而不是另外一個? code


我接受了最受歡迎(也頗有趣)的答案,但真正的答案彷佛是「不,沒有理由更喜歡一個而不是另外一個。」 blog

  • 它們是等價的(除非以下所述)。
  • 有些人有理由老是使用typename
  • 有些人有理由老是使用class
  • 有些人有理由同時使用這兩種方法。
  • 有些人並不關心他們使用哪個。

但請注意,在模板模板參數的狀況下,在C ++ 17以前,須要使用class而不是typename 。 請參閱下面的user1428839的答案 。 (但這個特殊狀況不是偏好問題,而是語言的要求。) ip


#1樓

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'

#2樓

有區別的,你應該更喜歡classtypename

但爲何?

typename對於模板模板參數是非法的,所以爲了保持一致,您應該使用classit

template<template<class> typename MyTemplate, class Bar> class Foo { };    //  :(
template<template<class>    class MyTemplate, class Bar> class Foo { };    //  :)

#3樓

擴展DarenW的評論。 io

一旦不接受typename和class很是不一樣,對它們的使用嚴格可能仍然有效。 僅當class真的是類時使用class,而且當它是基本類型時使用typename,例如char

確實也接受這些類型而不是typename

template < char myc ='/'>

在這種狀況下,甚至優於typename或class。

想一想其餘人的「暗示」或可理解性。 而且實際上認爲第三方軟件/腳本可能會嘗試使用代碼/信息來猜想模板發生了什麼(考慮swig)。


#4樓

據我所知,你使用哪個並不重要。 它們在編譯器的眼中是等價的。 使用您喜歡的任何一種。 我一般上課。


#5樓

Stan Lippman 在這裏談到了這一點 。 我以爲這頗有趣。

簡介 :Stroustrup最初使用class來指定模板中的類型,以免引入新的關鍵字。 委員會中的一些人擔憂這種關鍵字的超載致使了混亂。 後來,委員會引入了一個新的關鍵字typename來解決語法歧義,並決定讓它也用於指定模板類型以減小混淆,但爲了向後兼容, class保持其重載意義。

相關文章
相關標籤/搜索