Abbildung 1: Funktionsvorlagen
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;
}
Ist dies die richtige Verwendung extern template
oder verwende ich dieses Schlüsselwort nur für Klassenvorlagen wie in Abbildung 2?
Abbildung 2: Klassenvorlagen
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;
}
Ich weiß, dass es gut ist, all dies in eine Header-Datei zu packen, aber wenn wir Vorlagen mit denselben Parametern in mehreren Dateien instanziieren, haben wir mehrere gleiche Definitionen und der Compiler entfernt sie alle (außer einer), um Fehler zu vermeiden. Wie benutze ich extern template
? Können wir es nur für Klassen verwenden oder können wir es auch für Funktionen verwenden?
Außerdem können Abbildung 1 und Abbildung 2 zu einer Lösung erweitert werden, bei der sich Vorlagen in einer einzelnen Header-Datei befinden. In diesem Fall müssen wir das extern template
Schlüsselwort verwenden, um mehrere gleiche Instanziierungen zu vermeiden. Gilt das auch nur für Klassen oder Funktionen?
extern template class foo<int>();
scheint wie ein Fehler.
()
der externen Leitung "erwartete unqualifizierte ID" steht . Sowohl Ihr Buch als auch Ihr Visual Studio sind falsch. Versuchen Sie, einen standardkonformeren Compiler wie g ++ oder clang zu verwenden, und Sie werden das Problem sehen.