以前在C++中使用模板类,实现必须在头文件中或者#included到头文件的底部。
我已经有几年没有使用 C++ 模板了;我刚开始再次使用它们,并观察到这种行为似乎 持续存在。现在还是这样吗?还是编译器现在足够聪明,可以将实现与接口(interface)分开?
最佳答案
从技术上讲,它们不需要在头文件中。
这种用法的一个例子是当你有一个带有一组固定版本的模板类时(为了参数的缘故,假设是 char 和 wchar_t)。然后您可以将所有方法声明放入源文件中并显式实例化这两个版本。这具有其他人无法为不打算使用的类型分配模板的安全性。
// X.h
template<typename T>
class X
{
// DECLARATION ONLY OF STUFF
public:
X(T const& t);
private:
T m_t;
};
// X.cpp
#include "X.h"
// DEFINTION OF STUFF
template<typename T>
X<T>::X(T const& t)
:m_t(t)
{}
// INSTANCIATE The versions you want.
template class X<char>;
template class X<wchar_t>;
// Main.cpp
#include "X.h"
int main()
{
X<chat> x1('a');
X<wchar_t> x2(L'A');
// X<int> x3(5); // Uncomment for a linker failure.
}
假设人们不能直接包含 X.cpp(因为它不是由发行版提供的)那么其他人就不能使用 X
我还看到这种技术用于减少编译时间。因为每个编译单元都不会重新生成相同版本的 X,所以我们只能在一个地方获得定义(因此需要一个编译成本)。这样做的缩减是您必须手动实例化您使用的每个单独版本的 X。
关于C++ 模板 : header files still broken?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1492591/