相當直接:爲什麼你不能定義一個結構模板?
template <class T>
void foo() {} //compiles
template <struct T>
void goo() {} //doesn't
爲什麼?
相當直接:爲什麼你不能定義一個結構模板?
template <class T>
void foo() {} //compiles
template <struct T>
void goo() {} //doesn't
爲什麼?
class
僅僅是一個關鍵詞來指出T
是一種類型。它實際上並不意味着T
必須是一個類。 (例如,您可以撥打foo<int>()
。)
使用了class
關鍵字,因爲添加了模板功能時typename
不存在。見Templates in c++,typename and class。
由於模板必須與任何class
或聲明...
template <typename T>
void foo() {}
我在尋找這個規範背後的推理,而不僅僅是「因爲這就是標準所說的」。 – 2012-03-12 18:28:04
@LuchianGrigore:沒有什麼值得推理的了...需要一個關鍵字來標識一個* type *的佔位符,並且在定義他們本來可以基本決定的語言*任何*時,例如'template
@DavidRodríguez-dribeas其實肯尼的答案提供了一個很好的解釋。即使你的評論提供了更多解釋。 – 2012-03-12 18:33:52
因爲,語法禁止它:
template-declaration:
export_opt template< template-parameter-list > declaration
template-parameter-list:
template-parameter
parameter-declaration
type-parameter:
class identifier
class identifier = type-id
typename identifier
typename identifier = type-id
template < template-parameter-list > class identifier
template < template-parameter-list > class identifier = template-name
或者,你可以認爲結構是其中的成員全部是公共類的特殊情況。因此,允許它在模板參數列表中不會一般。
啊。所以你說班級和類型名稱是可以互換的,沒有任何副作用?從我+1。 – 2012-03-12 18:29:08
@LuchianGrigore:差不多。您必須在模板參數template class X>中使用'class',但是結構模板也可以替換爲'X'。 – kennytm 2012-03-12 18:31:02
' class X>'你在那裏迷路了。 – 2012-03-12 18:33:34