来自temp.local:
在外部出现的类模板成员的定义中 类模板定义的类,类的成员的名称 template隐藏任何封闭类的template-parameter的名称 模板(,但如果成员是成员,则不是成员的模板参数 类或函数模板)。 [例如:
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的成员名称,并且不编译该示例。
这是一个常见的错误。?
答案 0 :(得分:0)
虽然您提供的链接似乎是草稿并明确声明它不是任何标准(http://eel.is/c++draft/)的一部分,但草案中的此特定条款似乎与ISO C ++ 14.6.1相同7。
所以它确实似乎是一个常见的编译器错误或与其他子句冲突并丢失的子句。我验证了这个例子没有在MacOS Clang v802.0.42上编译。既然你说所有的主要编译器都在这里发出错误,我怀疑这个条款由于与其他一些条款的冲突而不合理实施。
编辑:我还在与此主题相关的标准社区here内找到了一个讨论。讨论的深度here告诉我,这条规则是有争议的,甚至可能会改变。