【问题标题】:hiding of template parameter of member template隐藏成员模板的模板参数
【发布时间】: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&lt;B&gt;::g(C) 中的 C 视为 A 的成员名称,并且不编译该示例。

这是一个常见的错误吗?

【问题讨论】:

  • 好吧,鉴于您尝试过的“每个编译器”都这样做了,我想不出更好的“通用”定义。将其描述为“常见”编译器错误是一个相当有说服力的论点。
  • 我的意思是“我尝试过的所有编译器都通用”。
  • C++ 编译器并不多。看起来你几乎都给他们起了名字。它们并不完全长在树上,你知道的……忽略历史编译器是安全的……

标签: c++ templates standards name-lookup


【解决方案1】:

虽然您提供的链接似乎是一个草案,并明确指出它不是任何标准的一部分 (http://eel.is/c++draft/),但草案中的这一特定条款似乎与 ISO C++ 14.6.1 第 7 段相同。

所以它确实似乎是一个常见的编译器错误或一个与其他子句冲突并丢失的子句。我验证了该示例无法在 MacOS Clang v802.0.42 上编译)。既然你说所有主要的编译器都会在这里发出错误,我会怀疑这个子句由于与其他一些子句冲突而不合理。

编辑:我还在标准社区here 中找到了与此主题相关的讨论。讨论的深度here 向我表明,这条规则是有争议的,甚至可能会改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    相关资源
    最近更新 更多