为什么以下模板声明格式错误?
Why is the following template declaration ill-formed?
为什么以下声明无效?
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>
^
基本上,"because the standard says so." C++11 14.1/1 列出了 类型参数的语法:
type-parameter:
class
...
opt identifieropt
class
identifieropt =
type-id
typename
...
opt identifieropt
typename
identifieropt =
type-id
template
<
template-parameter-list >
class
...
opt identifieropt
template
<
template-parameter-list >
class
identifieropt =
id-expression
如您所见,模板模板参数只允许class
。
我的基本原理猜测是任何类型都可以用作类型参数,包括非 class 类型。但是在 C++11 之前,没有 "non-class type template" 这样的东西——唯一的类型模板是 class 模板。
C++11 的别名模板改变了这一点,但模板模板参数语法显然没有跟上。尽管如此,在 post-C++11(实际上是 post-C++14)draft N4296 中,这个限制实际上被取消了,template <class> typename
是有效的模板模板参数语法.
为什么以下声明无效?
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>
^
基本上,"because the standard says so." C++11 14.1/1 列出了 类型参数的语法:
type-parameter:
class
...
opt identifieropt
class
identifieropt=
type-id
typename
...
opt identifieropt
typename
identifieropt=
type-id
template
<
template-parameter-list>
class
...
opt identifieropt
template
<
template-parameter-list>
class
identifieropt=
id-expression
如您所见,模板模板参数只允许class
。
我的基本原理猜测是任何类型都可以用作类型参数,包括非 class 类型。但是在 C++11 之前,没有 "non-class type template" 这样的东西——唯一的类型模板是 class 模板。
C++11 的别名模板改变了这一点,但模板模板参数语法显然没有跟上。尽管如此,在 post-C++11(实际上是 post-C++14)draft N4296 中,这个限制实际上被取消了,template <class> typename
是有效的模板模板参数语法.