【发布时间】: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->f(0),这使得 GCC 在实例化时在A<T,U>中查找。这是错误的方式 - 请参阅llvm.org/bugs/show_bug.cgi?id=5838 -
@Johannes Schaub - litb:谢谢