$ 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();
}
VS 2008 también da el error de ambigüedad. –
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 –
@Johannes Schaub - litb: Gracias – Chubsdad