非常简单:
template <class T>
void foo() {} //compiles
template <struct T>
void goo() {} //doesn't
为什么?
答案 0 :(得分:6)
class
只是一个关键字,表示T
是一种类型。它实际上并不意味着T
必须是一个类。 (例如,您可以拨打foo<int>()
。)
使用了class
关键字,因为添加模板功能时typename
不存在。请参阅Templates in c++,typename and class。
答案 1 :(得分:2)
因为必须使用class
或...
template <typename T>
void foo() {}
答案 2 :(得分:1)
因为,语法禁止它:
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
或者,您可以认为struct是一个类的特例,其中成员都是公共的。因此,在模板参数列表中允许它不会那么普遍。