图1:功能模板
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;
}
这是正确的使用方法extern template
,还是仅将关键字用于类模板,如图2所示?
图2:类模板
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;
}
我知道将所有这些都放在一个头文件中是很好的,但是如果我们在多个文件中实例化具有相同参数的模板,那么我们将获得多个相同的定义,并且编译器将全部删除(一个除外)以避免错误。如何使用extern template
?我们可以仅将其用于类,也可以将其用于函数吗?
而且,图1和图2可以扩展为一个解决方案,其中模板位于单个头文件中。在这种情况下,我们需要使用extern template
关键字来避免多个相同的实例。这也只适用于类或函数吗?
extern template class foo<int>();
似乎是一个错误。
()
在外部行附近说“ expected unqualified-id”的情况。您的书本和Visual Studio都错了,请尝试使用更符合标准的编译器(例如g ++或clang),您将看到问题。