什么是模板<>模板<> template-alias上下文中的语法为?

时间:2017-10-20 12:49:17

标签: c++ templates

(这个问题与模板模板参数无关。)

我刚刚发现GCC编译了这样的代码

template <typename A, typename B>
struct P {};

template <typename A>
template <typename B>
using Q = P<A, B>;

其中Q是一个双重模板的名称。

但是我无法使用它。当我写Q<short><long>时,我得到了

template_template.cpp:10:5: error: ‘Q<short int>’ is not a template
     Q<short><long>{};
     ^~~~~~~~
template_template.cpp:10:20: error: invalid use of incomplete type ‘Q<short int>’
     Q<short><long>{};
                    ^
template_template.cpp:2:8: note: declaration of ‘Q<short int>’
 struct P {};

为什么要编译第一个代码段?

是否有语法说服编译器Q<short>实际上是模板?

// GCC 6.3.0

1 个答案:

答案 0 :(得分:11)

C ++ 14标准在14p1中说:

  

模板声明中的声明应为    - 声明或定义函数,类或变量,或者    - 定义成员函数,成员类,成员枚举,或类模板或嵌套在类模板中的类的静态数据成员,或者    - 定义类或类模板的成员模板,或
   - 成为别名声明

此处 template-declaration 中的声明不是上述内容(它是另一个模板声明,它本身包含一个< em> alias-declaration ),因此代码无效。

语法的相关部分是:

  

模板声明
  模板&lt; template-parameter-list &gt; 声明
  
  别名声明
  使用标识符 attribute-specifier-seq opt = type-id ;

其中声明可以是模板声明 alias-declaration 或其他类型的声明。

请注意,语法本身接受给定的代码,但上述文本中的其他限制使其无效。