参见英文答案 >
Where and why do I have to put the “template” and “typename” keywords?6个
gcc,vc和clang接受以下代码.
gcc,vc和clang接受以下代码.
template<class T> struct A { template<class U> struct B {}; }; int main() { A<int>::B<int> y; // OK as expected A<int>::template B<int> x; // Also OK! Is this standard-compliant? };
使用A< int> :: template B< int>定义变量是否符合C标准? X;?
解决方法
虽然这是一个非规范性的说明,但我认为答案可以由n3797 [temp.names] / 6给出.
As is the case with the
typename
prefix,thetemplate
prefix is allowed in cases where it is not strictly necessary; i.e.,when the nested-name-specifier or the expression on the left of the->
or.
is not dependent on a template-parameter,or the use does not appear in the scope of a template.
在OP的示例中,前缀模板在模板范围之外使用,并且前面的嵌套名称说明符不依赖.因此,前缀模板不是必需的,但在此处允许.
[expr.prim.general] / 8
qualified-id:
nested-name-specifiertemplate
opt unqualified-id
另外[temp.names] / 5
A name prefixed by the keyword
template
shall be a template-id or the name shall refer to a class template.
[temp.names] / 1表示B< int>确实是一个(简单的)模板ID.