Figura 1: modelli di funzioni
TemplHeader.h
template<typename T>
void f();
TemplCpp.cpp
template<typename T>
void f(){
//...
}
//explicit instantation
template void f<T>();
main.cpp
#include "TemplHeader.h"
extern template void f<T>(); //is this correct?
int main() {
f<char>();
return 0;
}
È questo il modo corretto di utilizzare extern template
o devo usare questa parola chiave solo per i modelli di classe come nella Figura 2?
Figura 2: modelli di classe
TemplHeader.h
template<typename T>
class foo {
T f();
};
TemplCpp.cpp
template<typename T>
void foo<T>::f() {
//...
}
//explicit instantation
template class foo<int>;
main.cpp
#include "TemplHeader.h"
extern template class foo<int>();
int main() {
foo<int> test;
return 0;
}
So che è bene mettere tutto questo in un file di intestazione, ma se istanziamo modelli con gli stessi parametri in più file, avremo più definizioni uguali e il compilatore le rimuoverà tutte (tranne una) per evitare errori. Come si usa extern template
? Possiamo usarlo solo per le classi o possiamo usarlo anche per le funzioni?
Inoltre, la Figura 1 e la Figura 2 possono essere espanse in una soluzione in cui i modelli sono in un unico file di intestazione. In tal caso, dobbiamo utilizzare la extern template
parola chiave per evitare più istanze stesse. È solo per classi o funzioni?
extern template class foo<int>();
sembra un errore.
()
sulla linea esterna. sia il tuo libro che lo studio visivo sono sbagliati, prova a usare un compilatore conforme agli standard come g ++ o clang e vedrai il problema.