相当直接:为什么你不能定义一个结构模板?
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