Modelli C ++, riferimento non definito

Ho una funzione dichiarata così:

template  T read(); 

e definito così:

 template  T packetreader::read() { offset += sizeof(T); return *(T*)(buf+offset-sizeof(T)); } 

Tuttavia, quando provo ad usarlo nella mia funzione main ():

 packetreader reader; reader.read(); 

Ottengo il seguente errore da g ++:

 g++ -o main main.o packet.o main.o: In function `main': main.cpp:(.text+0xcc): undefined reference to `int packetreader::read()' collect2: ld returned 1 exit status make: *** [main] Error 1 

Qualcuno può indicarmi la giusta direzione?

Devi usare la parola chiave export . Tuttavia, non credo che G ++ abbia un supporto adeguato, quindi è necessario includere la definizione della funzione template nell’intestazione in modo che l’unità di traduzione possa usarla. Questo perché la ‘versione’ del modello non è stata creata, solo la versione ‘.

Un modo semplice è #include il file .cpp. Tuttavia, ciò può causare problemi, ad esempio quando altre funzioni si trovano nel file .cpp. Probabilmente aumenterà anche il tempo di compilazione.

Un modo pulito è quello di spostare le funzioni del modello nel proprio file .cpp e includerlo nell’intestazione o utilizzare la parola chiave export e compilarlo separatamente.

Ulteriori informazioni sul motivo per cui dovresti provare a inserire le definizioni delle funzioni del modello nel suo file di intestazione (e ignorare del tutto l’ export ).

Il problema è che un modello di funzione non è una funzione. È un modello per la creazione di funzioni secondo necessità.

Quindi, affinché un modello funzioni, il compilatore ha bisogno intuitivamente di due informazioni: il modello stesso e il tipo che deve essere sostituito in esso. Questo è diverso da una chiamata di funzione, che il compilatore può generare non appena sa che la funzione esiste. Non ha bisogno di sapere cosa fa la funzione, solo che assomiglia a void Frobnicate(int, float) , o qualunque sia la sua firma.

Quando dichiari il modello di funzione senza definirlo, stai solo dicendo al compilatore che tale modello esiste, ma non come appare. Non è sufficiente che il compilatore sia in grado di istanziarlo, ma deve essere in grado di vedere anche la definizione completa. La solita soluzione consiste nel mettere l’intero modello in un’intestazione che può essere inclusa dove necessario.

La migliore pratica con le funzioni del modello è definirli nei file di intestazione. Sono creati in fase di compilazione, quindi il compilatore deve avere una definizione per farlo.

Quando l’ export per i modelli sarebbe più supportata, questo non sarebbe il caso, ma al momento è ancora difficilmente utilizzabile.

Il loro modello di supporto compilatore è una compilazione separata?

Come so, la pratica comune è dichiarare e implementare le funzioni del modello nel file di intestazione