Why does not a template template parameter allow 'typename' after the parameter list
当使用模板模板的语法作为
error: template template parameter requires 'class' after the parameter list
EDOCX1&2&EDOCX1&1&2&EDOCX1&1&2&EDOCX1
你可以争辩说,当使用缓冲模板时,要求是你希望通过一个类别的东西,但这并不总是该案(特别是在C++11引入缓冲型别名之后)。
1 2 3 4 5 6 7 8 9 | template <template <typename> class T> // 'class' keyword required. struct Foo { using type = T<int>; }; template <typename T> using type = T (*)(); using func_ptr_t = Foo<type>::type; |
这背后的原因是什么?
- 是否有任何具体的原因,例如为什么不允许在坦帕拉特宣言?
- 标准答案是什么?
简短回答:因为标准是这么说的。
更长的答案:在标准化之前,C++模板需要所有模板参数的EDCOX1×0 }关键字。然而,为了强调模板也可以是非类(即内置)类型的事实,引入了可选关键字
输入C++ 11及其新的特征模板别名,现在也引入了非类模板,因此非类模板模板参数:
1 2 3 4 5 6 7 | template<typename T> struct A {}; template<typename T> using B = int; template<template<typename> class X> struct C; C<A> ca; // ok C cb; // ok, not a class template template<template<typename> typename X> struct D; // error, cannot use typename here |
上面的例子取自当前的C++ 1Z建议N4051,标题为允许EDCOX1,1在模板模板参数中,并建议精确地允许。
clang 3.5 SVN现在用
I'm looking for the rational behind this restriction [...]
在引入C++ 11之前,您可以传递给模板模板参数的唯一模板是类模板。这就是强制使用关键字
现在,这些参数可以是类模板或别名模板的名称,而且由于这些模板甚至没有远程连接,因此关键字