【问题标题】:Template+Dependent Name模板+从属名称
【发布时间】:2010-09-10 12:55:26
【问题描述】:

$14.6.2/3 - "在类模板或类模板成员的定义中,如果类模板的基类依赖于模板参数,则在非限定名称期间不检查基类范围在类模板或成员的定义点或在类模板或成员的实例化期间查找。"

因此,'D::g' 中的调用 'f(0)' 应该调用 'B:f'。但是 gcc(IdeOne) 给出了一个模棱两可的错误。

这是 gcc 中的错误吗? Comeau 编译得很好

template<class T, class U> struct A{
   template<class A, class B> A f(B b){A a; return a;}
};

struct B{
   double f(double d){return 0.0;}
};

template<class T, class U> struct D : A<T, U>, B{
   void g(){f(0);}
};

int main(){
   D<double, double> d;
   d.g();
}

【问题讨论】:

  • VS 2008 也会出现歧义错误。
  • 我认为 GCC 在 B 中找到了 f 并提前添加了隐式类成员访问 this-&gt;f(0),这使得 GCC 在实例化时在 A&lt;T,U&gt; 中查找。这是错误的方式 - 请参阅llvm.org/bugs/show_bug.cgi?id=5838
  • @Johannes Schaub - litb:谢谢

标签: c++ templates


【解决方案1】:

我认为它是 GCC 中的 known bug。根据错误报告,您的示例在 GCC 4.4.0 中都失败了。我认为这只是意味着它尚未在较新的版本上进行测试 - 并不是说​​它已被修复。

【讨论】:

  • 誓言!感谢参考
猜你喜欢
  • 2021-03-21
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 2018-06-28
  • 2014-03-22
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多