$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();
}
最佳答案
我认为它是一个 known bug在海湾合作委员会。根据错误报告,您的示例迟至 GCC 4.4.0 失败。我认为这只是意味着它还没有在较新的版本上进行过测试 - 而不是它已被修复。
关于c++ - 模板+相关名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3684756/