为什么不能用结构定义模板?

Why can't you define a template with a struct?

提问人:Luchian Grigore 提问时间:3/13/2012 更新时间:3/13/2012 访问量:890

问:

很简单:

template <class T>
void foo() {}  //compiles

template <struct T>
void goo() {}  //doesn't

为什么?

C++ 模板

评论


答:

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>classclassclassclassstruct
0赞 Luchian Grigore 3/13/2012
@DavidRodríguez-dribeas 实际上,肯尼的回答提供了一个很好的解释。甚至您的评论也提供了更多解释。
6赞 kennytm 3/13/2012 #2

class只是一个关键字,用于指示它是一种类型。它实际上并不意味着必须是一个类。 (例如,你可以调用 。TTfoo<int>()

之所以使用该关键字,是因为在添加模板功能时不存在该关键字。请参阅 c++、typename 和 class 中的模板classtypename

评论

0赞 Luchian Grigore 3/13/2012
啊。所以你是说类和类型名是可以互换的,没有任何副作用?+1 来自我。
0赞 kennytm 3/13/2012
@LuchianGrigore:差不多。您必须在 template-template 参数中使用,但随后也可以将 struct-template 替换为 。classtemplate <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/224671classtypename<...>
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 中允许它不会那么普遍。