2010-07-19 14 views
8

Possibili duplicati:
GCC problem : using a member of a base class that depends on a template argument
Why does GCC need extra declarations in templates when VS does not?
Why doesn’t a derived template class have access to a base template class
iphone compiler inherited templated base classes with passed through type not being expanded in time (just look)classe C++ Template eredita un'altra classe template con un tipo di input modello specificato

Ci scusiamo per il titolo di confusione, meglio che potrei inventare.

Ecco po 'di codice per illustrare il mio problema ...

una classe template di base:

template<class T> class TestBase 
{ 
public: 
    int someInt; 
}; 


Cercando di sottoclasse TestBase con un'altra classe template ...

Questo ottiene "someInt non è stato dichiarato in questo ambito" in fase di compilazione:

template<class X> class TestSub : public TestBase<X> 
{ 
    void testf() 
    { 
     someInt = 0; //Error: "someInt was not declared in this scope" 
    } 
}; 



B) Ciò funziona benissimo (con la differenza che ho specificato input del modello di TestBase esplicitamente)

template<class X> class TestSub : public TestBase<string> 
{ 
    void testf() 
    { 
     someInt = 0; 
    } 
}; 



Perchè TestSub da (A) non erediteranno someInt correttamente come in (B)?

Grazie in anticipo.

+1

Chiuso come un duplicato di http://stackoverflow.com/questions/11405/gcc-problem-using-a-member-of-a-base-class-that-depends-on-a-template-argument e http://stackoverflow.com/questions/1643035/typedef-in-template-base-class e http://stackoverflow.com/questions/1239908/why-doesnt-a-ivedived-template-class-have-access- to-a-base-template-class e http://stackoverflow.com/questions/2812470/why-does-gcc-need-extra-declarations-in-templates-when-vs-does-not e molti altri –

risposta

7

Poiché TestBase può essere specializzato su X qualunque X finisca per essere. Quindi è necessario lasciare che la compilazione sappia qualcosa. È un valore dipendente, qualificandolo completamente. Invece di

 someInt = 0 

dicono piuttosto

 TestBase<X>::someInt = 0 

Si potrebbe anche usare

 this->someInt = 0 

Il punto è che il compilatore non assumerà un nome dipende da un parametro di template si deve sapere che è prima che rimandi tale controllo al tempo di istanziazione. Per un esperimento, vedi cosa succede quando introduci un elementoInt globale.

+1

oppure invece di una qualifica completa basta usare 'this-> someInt'. –

+0

Sì, l'ho appena aggiunto. –

+1

Si prega di notare che differire la ricerca fino a quando l'istanziazione non è sufficiente. Lo standard afferma esplicitamente che anche al momento dell'istanziazione, i nomi non qualificati non vengono cercati nelle classi di base dipendenti durante la ricerca non qualificata. Capita di lavorare per 'this-> someInt' e altri perché quelli non fanno la ricerca non qualificata. Questo dettaglio è spesso trascurato quando si ragiona su di esso, ma è importante. –

Problemi correlati