提问人:Luchian Grigore 提问时间:3/13/2012 更新时间:3/13/2012 访问量:890
为什么不能用结构定义模板?
Why can't you define a template with a struct?
问:
很简单:
template <class T>
void foo() {} //compiles
template <struct T>
void goo() {} //doesn't
为什么?
答:
2赞
DevSolar
3/13/2012
#1
因为模板必须用 either 或 ...class
template <typename T>
void foo() {}
评论
0赞
Luchian Grigore
3/13/2012
我更多地在寻找这个规范背后的原因,而不仅仅是“因为这就是标准所说的”。
1赞
David Rodríguez - dribeas
3/13/2012
@LuchianGrigore:没什么好说的......需要一个关键字来标识类型的占位符,并且在定义语言时,他们基本上可以决定任何事情,例如,但他们选择使用(重用现有关键字以避免增加保留关键字的数量)。请注意,在类型声明中,这种用法不是 的同义词,而 的用法又类似于 。template <type T>
class
class
class
class
struct
0赞
Luchian Grigore
3/13/2012
@DavidRodríguez-dribeas 实际上,肯尼的回答提供了一个很好的解释。甚至您的评论也提供了更多解释。
6赞
kennytm
3/13/2012
#2
class
只是一个关键字,用于指示它是一种类型。它实际上并不意味着必须是一个类。 (例如,你可以调用 。T
T
foo<int>()
之所以使用该关键字,是因为在添加模板功能时不存在该关键字。请参阅 c++、typename 和 class 中的模板。class
typename
评论
0赞
Luchian Grigore
3/13/2012
啊。所以你是说类和类型名是可以互换的,没有任何副作用?+1 来自我。
0赞
kennytm
3/13/2012
@LuchianGrigore:差不多。您必须在 template-template 参数中使用,但随后也可以将 struct-template 替换为 。class
template <template <typename> class X>
X
0赞
Luchian Grigore
3/13/2012
<template <typename> class X>
你把我丢在那里了。
0赞
kennytm
3/13/2012
@LuchianGrigore:好吧,如果你不知道它是什么,那么是的,在;)内可以互换。有关模板-模板参数的说明,请参阅 stackoverflow.com/a/6485439/224671。class
typename
<...>
1赞
user677656
3/13/2012
#3
因为,语法禁止它:
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是一个类的特例,其中成员都是公共的。因此,在 template-parameter-list 中允许它不会那么普遍。
评论