【发布时间】:2017-05-09 20:59:49
【问题描述】:
来自temp.local:
在一个类模板的成员定义中出现在外面 类模板定义,类成员的名称 模板隐藏任何封闭类的模板参数的名称 模板(但不是该成员的模板参数,如果该成员是 类或函数模板)。 [ 例子:
template<class T> struct A { struct B { /* ... */ }; typedef void C; void f(); template<class U> void g(U); }; template<class B> void A<B>::f() { B b; // A's B, not the template parameter } template<class B> template<class C> void A<B>::g(C) { B b; // A's B, not the template parameter C c; // the template parameter C, not A's C }—结束示例]
问题在于,我尝试过的每个编译器(g++、vc、icc、clang)都将 A<B>::g(C) 中的 C 视为 A 的成员名称,并且不编译该示例。
这是一个常见的错误吗?
【问题讨论】:
-
好吧,鉴于您尝试过的“每个编译器”都这样做了,我想不出更好的“通用”定义。将其描述为“常见”编译器错误是一个相当有说服力的论点。
-
我的意思是“我尝试过的所有编译器都通用”。
-
C++ 编译器并不多。看起来你几乎都给他们起了名字。它们并不完全长在树上,你知道的……忽略历史编译器是安全的……
标签: c++ templates standards name-lookup