为什么以下模板声明格式不正确?

时间:2015-04-03 09:57:54

标签: c++ templates c++11 standards

为什么以下声明无效?

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>
                                  ^

1 个答案:

答案 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是有效的模板模板参数语法。