$ 14,6.2/3 - "Nella definizione di un modello di classe o un membro di un modello di classe, se una classe base del modello di classe dipende da un parametro modello, l'ambito della classe base non è esaminato durante la ricerca del nome non qualificato nel punto di definizione del modello di classe o membro o durante un'istanza del modello o membro della classe. "Modello + Nome dipendente
Per questo, la chiamata 'f(0)'
in 'D::g'
deve chiamare 'B:f'
. Tuttavia gcc (IdeOne) fornisce un errore ambiguit.
Si tratta di un bug in gcc? Comeau compila bene
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 fornisce anche l'errore di ambiguità. –
Penso che GCC trovi il 'f' in' B' e aggiunge l'accesso implicito al membro della classe prematuramente, 'this-> f (0)', che fa in modo che GCC cerchi in 'A' durante l'istanziazione. Questo è il modo sbagliato - vedi http://llvm.org/bugs/show_bug.cgi?id=5838 –
@Johannes Schaub - litb: Grazie – Chubsdad