成员模板模板参数的隐藏

hiding of template parameter of member template

本文关键字:隐藏 参数 成员      更新时间:2023-10-16

来自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),将C在A<B>::g(C)中作为A的成员名称对待,并且不编译该示例。

这是一个常见的错误。?

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

因此,它确实确实是一个常见的编译器错误,也可以是与其他条款相冲突并失去的条款。我验证了该示例未在MacOS Clang V802.0.42上编译。由于您说所有主要编译器都在此处发出错误,因此我怀疑由于与其他一些条款的冲突而实施该条款是不合理的。

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