模板分为模板类和模板函数。
分析为什么模板不支持分离编译?
首先,定义模板类需要template,而定义模板的目的就是为了在写代码的时候不需要考虑代码的多种类型,重复率高的代码段,降低效率还增加编译器的复杂性,为追求更高效的代码编译方法,使用模板来编写代码。
其次,既然是模板,在可以重复利用的代码段就不会考虑数据类型,但是当函数调用时候,即需要数据参与的时候就需要对模板实例化,这时候如果分离编译,就不能将利用模板所写的函数进行实例化,所写的模板函数就实际上没有被调用。
我们可以分析,当程序从main函数进入,看到有Test()函数的调用,自然会去找函数,由存在main函数的.cpp文件中所包含的Test.h头文件展开,就找到Test()函数,此函数又是将模板实例化,调用类内的PushBack()以及Pop()函数,但是类内只有这两个函数的声明,没有具体的函数实现,当实例化后也就需要连接具体的函数实现,自然要找函数代码,但是这里连接器找不到具体的函数实现,因为在模板类中,模板没有被实例化,编译器也不会自动再为你实例化找函数,所以就找不到函数存在的另外的.cpp文件,自然就会出错,出现连接错误。
所以模板不能分离编译。