最佳答案
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所示?
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
关键字来避免多个相同的瞬间。这也只适用于类或函数吗?