C++分离式编译
就我最常用的vs来说,对于每个cpp都是独立编译再进行链接的。而为了保证一个cpp能调用另一个cpp而不会导致另一个被编译两次(include另一个文件会在预处理时展开并参与编译),一般都会将类和函数的声明写在h文件中并在cpp中include。所以一般的类和函数都会在编译时确定它的声明但没有定义,会留到链接时与其他文件中的定义进行链接。
模板的问题
所以根据分离式编译,模板就不能声明在.h中而在cpp中定义了。因为模板在编译时不会直接根据定义生成代码,而是根据相应的实例生成对应类型的代码。
如果采用分离式编译,在一个cpp中调用了另一个文件的模板类或函数而只include了.h文件,这时本cpp只有这个模板的声明而没有定义,编译器会想处理其他函数一样等待链接时找到定义。然而被调用的模板类或函数的定义写在cpp中,被独自编译,所以其中并没有具体实现,不会被编译成具体的代码。最终导致在链接过程中,调用模板的文件找不到能链接的定义,所以就会报错。