为什么以下声明无效?
template<template<typename> typename T>
struct S {};
我认为这是有效的,因为以下内容是有效的:
template<template<typename> class T>
struct S {};
以及我从[gram.temp]中的标准中读到的内容似乎是有效的,但是gcc给了我以下输出:
prog.cpp:4:38: error: expected 'class' before 'T'
template<template<typename> typename T>
^
答案 0 :(得分:4)
基本上,“因为标准是这么说的。” C ++ 11 14.1 / 1列出了 type-parameter:
的语法型参数:
class
...
opt 标识符 opt
class
标识符 opt=
type-id
typename
...
opt 标识符 opt
typename
标识符 opt=
type-id
template
<
template-parameter-list>
class
...
opt 标识符 opt
template
<
template-parameter-list>
class
标识符 opt=
id-expression
如您所见,模板模板参数仅允许class
。
我对基本原理的猜测是任何类型都可以用作类型参数,包括非类类型。但在C ++ 11之前,没有“非类型模板”这样的东西 - 唯一的类型模板是类模板。
这已经改变了C ++ 11的别名模板,但模板模板参数语法显然没有跟上。然而,在后C ++ 11(实际上是后C ++ 14)draft N4296中,这个限制实际上被解除了,template <class> typename
是有效的模板模板参数语法。