TemplHeader.h
template<typename T>
void f();
Run Code Online (Sandbox Code Playgroud)
TemplCpp.cpp
template<typename T>
void f(){
//...
}
//explicit instantation
template void f<T>();
Run Code Online (Sandbox Code Playgroud)
Main.cpp的
#include "TemplHeader.h"
extern template void f<T>(); //is this correct?
int main() {
f<char>();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是正确的使用方法extern template,还是仅将此关键字用于类模板,如图2所示?
TemplHeader.h
template<typename T>
class foo {
T f();
};
Run Code Online (Sandbox Code Playgroud)
TemplCpp.cpp
template<typename T>
void foo<T>::f() {
//...
}
//explicit instantation
template class foo<int>;
Run Code Online (Sandbox Code Playgroud)
Main.cpp的
#include "TemplHeader.h"
extern template class foo<int>();
int main() {
foo<int> test;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我知道将所有这些放在一个头文件中是好的,但如果我们在多个文件中实例化具有相同参数的模板,那么我们会得到多个相同的定义,编译器会将它们全部删除(除了一个)以避免错误.我该怎么用 …
说我声明一个模板类A中a.h
#include <iostream>
template<bool b>
class A {
public:
void print(std::ostream& out);
};
Run Code Online (Sandbox Code Playgroud)
并确定在打印方法a.cpp(与明确的instatiation true和false)
#include "a.h"
template<bool b>
void A<b>::print(std::ostream& out) {
out << "A" << b;
}
template class A<true>;
template class A<false>;
Run Code Online (Sandbox Code Playgroud)
main.cpp可以是一个主要的主要程序示例
#include "a.h"
int main() {
A<true> a;
a.print(std::cout);
}
Run Code Online (Sandbox Code Playgroud)
上面的小项目编译得很好.
问题:如果我将显式实例化放在print方法(in a.cpp)的定义之上,则代码不再编译,并且通常会undefined reference to A<true>::print(...)出现错误.
#include "a.h"
template class A<true>;
template class A<false>;
template<bool b>
void A<b>::print(std::ostream& out) { …Run Code Online (Sandbox Code Playgroud)