Figure 1: 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 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 seul fichier d'en-tête, mais si nous instancions des modèles avec les mêmes paramètres dans plusieurs fichiers, nous avons alors plusieurs définitions identiques et le compilateur les supprimera toutes (sauf une) pour éviter les erreurs. Comment utiliser extern template
? Pouvons-nous l'utiliser uniquement pour les classes, ou pouvons-nous l'utiliser aussi pour les fonctions?
De plus, les figures 1 et 2 peuvent être développées en une solution dans laquelle les modèles sont dans un seul fichier d'en-tête. Dans ce cas, nous devons utiliser le extern template
mot - clé pour éviter plusieurs instanciations identiques. Est-ce uniquement pour les classes ou les fonctions?
extern template class foo<int>();
semble être une erreur.
()
de la ligne externe. votre livre et votre studio visuel sont faux, essayez d'utiliser un compilateur plus conforme aux normes comme g ++ ou clang et vous verrez le problème.