2011-11-02 12 views
6

Ciao e buona giornata a te.C++: compilazione completa del modello di forza (MSVC/G ++)

seguente frammento di codice compila il cl.exe (15.00.30729.01) e mingw-g ++ (4.4.0):

template<typename T> class Test{ 
public: 
    T t; 
    void error(){ 
     int doesNotExist = 6; 
     return doesNotExist;//<---- void function returning result 
    } 
}; 

int main(int argc, char** argv){ 
    Test<int> test; 
    return 0; 
} 

Inoltre, sulla cl.exe si può anche ottenere via con qualcosa di simile a questo:

template<typename T> class Test{ 
public: 
    T t; 
    void error(){ 
     doesNotExist = 6;//<---- undeclared variable 
     return doesNotExist;//<---- void function returning result 
    } 
}; 

Ora, questo ovviamente accade perché il compilatore non crea contenuti per i metodi di una classe modello finché qualcuno non li chiama. Tuttavia, questo può creare problemi quando si progetta una classe template di grandi dimensioni (perché è molto probabile che si dimentichi di aggiungere la chiamata di prova al nuovo metodo da qualche parte).

La domanda:
Esiste un'opzione del compilatore per g ++ o cl.exe che costringerebbe compilatore per elaborare intero modello (quindi questo frammento di codice attiverà errore di compilazione)?

risposta

11

Se si desidera testare il modello con un paio di tipi, è possibile attivare istanze manuali dei tipi, come in:

// at namespace level 
template class Test<int>; 

istanze esplicite di modelli di classe attivare automaticamente l'istanza di tutti i membri, che sembra essere quello che vuoi

Il problema reale è che il linguaggio è progettato per consentire esplicitamente il comportamento che si desidera evitare. Quando un modello di classe viene istanzializzato in modo implicito, il compilatore creerà un'istanza solo per quei metodi che sono utilizzati. Il caso d'uso principale della caratteristica è che alcuni metodi potrebbero imporre requisiti più stringenti al tipo di istanza di altri, se tutti i metodi sono stati istanziati sempre quindi il modello di classe potrebbe essere utilizzato solo con quei tipi che soddisfano i requisiti più rigidi.

Consentendo al compilatore di istanziare solo i metodi utilizzati, il modello di classe può essere utilizzato con tipi che non soddisfano tutti i requisiti di tutti i metodi, purché soddisfino i requisiti dei metodi che sono effettivamente usati.

Un esempio comune è operator[] in std::map<> che richiede l'value_type essere default-costruibile (operator[] creerà un nuovo oggetto predefinita inizializzato se la chiave non è presente nel contenitore e restituire un riferimento ad esso). Il comportamento nella lingua consente di utilizzare std::map su tipi che non sono predefiniti-constructible finché non si utilizza operator[] (o qualsiasi altra funzione membro che impone tale requisito).

+2

Sì, l'istanziazione modello esplicita è ciò che desideri. Vedere anche: http://msdn.microsoft.com/en-us/library/by56e477%28VS.80%29.aspx –

+0

Bella spiegazione dello scopo reale per non avere errore di compilazione. – iammilind

+0

Ok, funziona. Accetto la tua risposta, ma non era proprio necessario spiegare PERCHÉ funziona in questo modo (lo sapevo già). Grazie per la risposta. – SigTerm

Problemi correlati