模板+相关名称

发布于 2024-09-18 05:20:24 字数 559 浏览 16 评论 0原文

$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();
}

$14.6.2/3 - "In the definition of a class template or a member of a class template, if a base class of the class template depends on a template-parameter, the base class scope is not examined during unqualified name lookup either at the point of definition of the class template or member or during an instantiation of the class template or member."

As per this, the call 'f(0)' in 'D::g' should call 'B:f'. However gcc(IdeOne) gives an ambiguit error.

Is this a bug in gcc? Comeau compiles it fine

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();
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

薯片软お妹 2024-09-25 05:20:25

我认为这是一个已知的 GCC 错误,已修复。

根据错误报告,您的示例迟至 GCC 4.4.0 都会失败。我认为这只是意味着它还没有在新版本上进行过测试 - 并不是说​​它已经被修复。

I think it is a known GCC bug which has been fixed.

According to the bug report, your example fails as late as GCC 4.4.0. I think that just means it hasn't been tested on a newer version though - not that it's been fixed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文