为什么 C++ 模板只能在头文件中实现?
在 C++ 中实例化一个模板时,编译器新建一个类。此类具有 template argument 替换为在使用中传递给它的实际参数的所有位置。例如,-
template<typename T> class MyClass { T foo; T myMethod(T arg1, T arg2) { // Impl } };
并且在程序中某个地方使用这个类,
MyClass<int> x;
编译器在遇到此类时,为传递给它的每种类型参数创建一个新类。例如,如果使用不同的模板参数创建了 3 个对象,那么将得到 3 个类,它们等同于 -
class MyClassInt { int foo; int myMethod(int arg1, int arg2) { // Impl } };
为做到这一点,编译器在遇到这些语句之前需要已经能访问该类的实现以及方法,以便用模板参数(本例中为 int)实例化它们。如果这些模板类的实现不在头文件中,则它们将不可访问,并且因此无法编译。
广告