2010-04-29 9 views
6

Sto cercando di utilizzare le variabili membro di una classe di base su modelli in una classe derivata, come in questo esempio:Uso variabili membro ereditati da una classe di base su modelli (C++)

template <class dtype> 
struct A { 
    int x; 
}; 

template <class dtype> 
struct B : public A<dtype> { 
    void test() { 
     int id1 = this->x;  // always works 
     int id2 = A<dtype>::x; // always works 
     int id3 = B::x;   // always works 
     int id4 = x;   // fails in gcc & clang, works in icc and xlc 
    } 
}; 

gcc e clang sono entrambi molto schizzinosi sull'utilizzo di questa variabile e richiedono un ambito esplicito o l'uso esplicito di "questo". Con alcuni altri compilatori (xlc e icc), le cose funzionano come mi aspetterei. Si tratta di un caso di xlc e icc che consente il codice non standard o un bug in gcc e clang?

+1

Domanda simile: http://stackoverflow.com/questions/11405/gcc-problem-using-a-member-of-a-base-class-that-depends-on-a-template-argument –

risposta

5

Probabilmente stai compilando in modalità non rigida in icc. Ad ogni modo, dal momento che x non è qualificato, non deve essere cercato in nessuna classe base che dipende dai parametri del modello. Quindi, nel tuo codice, non è stato trovato il luogo in cui è stato trovato x e il tuo codice non è valido.

Gli altri nomi vengono cercati utilizzando un'altra forma di ricerca (ricerca di accesso membro della classe e ricerca qualificata). Entrambe le forme esamineranno le classi di base dipendenti se possono (vale a dire se sono dipendenti e sono quindi ricercate quando si crea un'istanza del modello quando è noto lo dtype - tutti gli altri nomi dipendono dai parametri del modello).

Anche GCC nelle versioni più recenti non lo implementano correttamente e alcuni nomi dipendenti still resolve against dependent bases durante la ricerca non qualificata.

Problemi correlati