2011-11-21 15 views
14

Ho appena letto l'articolo wiki su CRTP e sono un po 'confuso sull'istanza del modello.istanza modello di classe

Secondo il wiki,

corpi funzione membro (definizioni) non sono istanziati solo molto tempo dopo loro dichiarazioni.

Non capisco cosa significhi.

Supponiamo che ho avuto un modello di classe:

template <typename T> 
class A 
{ 
    public: 
     void foo(T t) 
     { 
      //... 
     }; 
}; 

Quando un'istanza della classe template A, lo fa istanziare la funzione foo membro()?

Ad esempio:

//in .cpp file 
int main() 
{ 
    A<int> a; //question 1 
       //class template is instantiated here, isn't it? 
       //What about foo(), is it instantiated too? 

    a.foo(10); //question 2 
       //according to the quotation, foo() will not be instantiated until it is used. 
       //if so, foo() is instantiated right here, not in question 1, right? 
} 
+2

spina: Questo può rispondere alle vostre domande: http: // StackOverflow.it/questions/7182359/template-instantiation-details-of-gcc-and-ms-compilers/7241548 # 7241548 –

risposta

12

Lei sembra confondere una cosa:

la creazione di istanze accade durante la compilazione , non durante il runtime. Quindi non è possibile dire "su quale riga" è stato istanziato un modello di classe o un modello di funzione.

Detto questo, hai ragione sul fatto che i modelli di funzione membro non vengono istanziati insieme ai modelli di classe.

Si potrebbe osservare in tal caso: Lei ha i seguenti file

  • template.h (definisce classe A e la funzione A :: foo)
  • a.cpp (usa A)
  • b.cpp (utilizza A e A :: foo)

Quindi durante la compilazione di a.cpp, solo A verrebbe istanziato. Tuttavia, durante la compilazione di b.cpp, entrambi sarebbero istanziati.

Per questo motivo, nel caso in cui A :: foo contenesse un codice semanticamente non valido per un determinato set di parametri del modello, si otterrebbero errori di compilazione in b.cpp, ma non a.cpp.

Spero che chiarisca le cose!

+0

Lo capisco ora, grazie. – Alcott

8

Con i modelli di classe, la regola empirica è che solo i membri sono istanziati che vengono effettivamente utilizzati.

Se si desidera completa di istanze, C++ offre esplicita esemplificazione (tuttavia, di solito non lo fai, il fatto che non tutti i bit è completamente un'istanza significa che la vostra classe modello è ancora più generica in quanto riduce i requisiti in materia T , si noti che il controllo della sintassi e la ricerca di tipi non dipendenti (elementi che non dipendono da T) si verificano ancora).

Troverete una risposta più completa qui: Template instantiation details of GCC and MS compilers

+0

Voto superiore per menzionare l'istanziazione completa della forza di istanziazione esplicita – FaceBro

Problemi correlati