Rysunek 1: szablony funkcji
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;
}
Czy jest to właściwy sposób użycia extern template
, czy też używam tego słowa kluczowego tylko dla szablonów klas, jak na rysunku 2?
Rysunek 2: szablony klas
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;
}
Wiem, że dobrze jest umieścić to wszystko w jednym pliku nagłówkowym, ale jeśli utworzymy wystąpienia szablonów z tymi samymi parametrami w wielu plikach, otrzymamy wiele takich samych definicji i kompilator usunie je wszystkie (z wyjątkiem jednego), aby uniknąć błędów. Jak używać extern template
? Czy możemy go używać tylko do klas, czy też możemy go używać do funkcji?
Również Rysunek 1 i Rysunek 2 można rozszerzyć do rozwiązania, w którym szablony znajdują się w jednym pliku nagłówkowym. W takim przypadku musimy użyć extern template
słowa kluczowego, aby uniknąć wielu takich samych instancji. Czy dotyczy to tylko klas lub funkcji?
extern template class foo<int>();
Wydaje się też, że to pomyłka.
()
linii zewnętrznej jest napisane „oczekiwany niekwalifikowany identyfikator” . zarówno twoja książka, jak i studio wizualne są złe, spróbuj użyć bardziej zgodnego ze standardami kompilatora, takiego jak g ++ lub clang, a zobaczysz problem.