2010-09-10 7 views
5

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

VS 2008 donne également l'erreur d'ambiguïté. –

+3

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 –

+0

@Johannes Schaub - litb: Merci – Chubsdad

Répondre

5

Je pense qu'il s'agit d'un known bug dans GCC. Selon le rapport de bug, votre exemple échoue aussi tard que GCC 4.4.0. Je pense que cela signifie simplement qu'il n'a pas été testé sur une version plus récente - mais pas qu'il a été corrigé.

+0

Vow !. Merci pour la référence – Chubsdad