2010-09-10 17 views
5

$ 14.6.2/3 - "En la definición de una plantilla de clase o miembro de una plantilla de clase, si una clase base de la plantilla de clase depende de un parámetro de plantilla, el alcance de la clase base no es examinado durante la búsqueda de nombres no calificados en el momento de la definición de la plantilla de clase o miembro o durante una instanciación de la plantilla o miembro de clase ".Template + Dependent Name

Según esto, la llamada 'f(0)' en 'D::g' debe llamar al 'B:f'. Sin embargo, gcc (IdeOne) da un error ambiguo.

¿Esto es un error en gcc? Comeau lo compila bien

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 también da el error de ambigüedad. –

+3

Creo que GCC encuentra la 'f' en' B' y agrega el acceso implícito al miembro de la clase prematuramente, 'this-> f (0)', que hace que GCC busque en 'A 'en la creación de instancias. Esta es la manera incorrecta - vea http://llvm.org/bugs/show_bug.cgi?id=5838 –

+0

@Johannes Schaub - litb: Gracias – Chubsdad

Respuesta

5

Creo que es un known bug en GCC. Según el informe de error, su ejemplo falla tan tarde como GCC 4.4.0. Creo que eso solo significa que, aunque no se ha probado en una versión más nueva, no es que se haya solucionado.

+0

Vow !. Gracias por la referencia – Chubsdad