2010-09-10 69 views
5

$ 14.6.2/3 - “在类模板或类模板成员的定义中,如果类模板的基类依赖于模板参数,则基类作用域不是在定义类模板或成员时或在类模板或成员的实例化过程中,在非限定名称查找过程中进行检查。“模板+从属名称

根据这个,拨打电话'f(0)''D::g'应拨打'B:f'。然而gcc(IdeOne)给出了一个模糊错误。

这是gcc中的错误吗?科莫编译它很好

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

VS 2008也给出了模糊性错误。 – 2010-09-10 13:14:05

+3

我认为GCC在'B'中找到'f'并且过早地添加隐式类成员访问'this-> f(0)',这使得GCC在实例化时在'A '中查找。这是错误的方式 - 请参阅http://llvm.org/bugs/show_bug.cgi?id=5838 – 2010-09-10 13:27:58

+0

@Johannes Schaub - litb:谢谢 – Chubsdad 2010-09-10 16:11:14

回答

5

我认为这是一个在GCC的known bug。根据错误报告,你的例子迟到了GCC 4.4.0。我认为这仅仅意味着它尚未在新版本上进行过测试 - 并不是它已被修复。

+0

誓言!感谢您的参考 – Chubsdad 2010-09-10 16:11:44