Figure 1: les modèles de fonction
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;
}
Est-ce la bonne façon d'utiliser des extern template
, ou dois-je utiliser ce mot-clé uniquement pour les modèles de classe comme dans la Figure 2?
Figure 2: modèles de 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;
}
Je sais qu'il est bon de mettre tout cela dans un fichier d'en-tête, mais si nous instancier les modèles avec les mêmes paramètres dans plusieurs fichiers, puis nous avons eu de multiples mêmes définitions et le compilateur va supprimer tous (sauf un) pour éviter les erreurs. Comment puis-je utiliser extern template
? Pouvons-nous l'utiliser uniquement pour les classes, ou pouvons-nous l'utiliser pour les fonctions de trop?
Aussi, la Figure 1 et la Figure 2 peut être étendu à une solution où les modèles sont dans un seul fichier d'en-tête . Dans ce cas, nous devons utiliser l' extern template
mot-clé pour éviter les multiples d'un même instantations. Est-ce que pour des classes ou des fonctions trop?