2010-09-10 12 views
5

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

VS 2008 fornisce anche l'errore di ambiguità. –

+3

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 –

+0

@Johannes Schaub - litb: Grazie – Chubsdad

risposta

5

penso che sia un known bug in GCC. Secondo il bug report, il tuo esempio fallisce fino a GCC 4.4.0. Penso che questo significhi solo che non è stato testato su una versione più recente - non che sia stato corretto.

+0

Voto !. Grazie per il riferimento – Chubsdad

Problemi correlati