14.6.2/3 - "Dans la définition d'un modèle de classe ou d'un membre d'un modèle de classe, si une classe de base du modèle de classe dépend d'un paramètre modèle, la portée de la classe de base n'est pas examiné lors de la recherche de nom non qualifié, soit au moment de la définition du modèle de classe ou du membre, soit lors d'une instanciation du modèle de classe ou du membre. "Modèle + Nom dépendant
Pour cette raison, l'appel 'f(0)'
dans 'D::g'
doit appeler 'B:f'
. Cependant, gcc (IdeOne) donne une erreur ambigüe.
Est-ce un bug dans gcc? Comeau le compile 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 donne également l'erreur d'ambiguïté. –
Je pense que GCC trouve le 'f' dans' B' et ajoute prématurément l'accès implicite aux membres de classe, 'this-> f (0)', ce qui oblige GCC à rechercher dans 'A' à l'instanciation. C'est la mauvaise façon - voir http://llvm.org/bugs/show_bug.cgi?id=5838 –
@Johannes Schaub - litb: Merci – Chubsdad