为什么只能在头文件中实现C ++模板?

在C ++中实例化模板时,编译器会创建一个新类。此类将您放置模板参数的所有位置替换为使用时传递给它的实际参数。对于例如-

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)实例化它们。如果这些模板类实现不在头文件中,则将无法访问它们,因此将无法编译它们。