模板为什么不支持分离编译
通常我们习惯于将函数分离编译,即:
对于一个函数fun 分离编译:
在xx.h中给出函数定义
在xx.cpp中完成函数
在xxmain.cpp中调用函数
先看一般情况下,编译器如何对函数分离编译:
--------------------------------------------------------------------------------------------------------------
1.编译:将xx.cpp,xxmain.cpp分别编译成xx.obj,xxmain.obj 而因为xxmain.cpp中没有对fun的实现,所以在
xxmain.obj中仅有一条call指令声明调用了fun函数,将fun当成外部链接函数处理
2.链接:在xx.obj中有fun函数的具体实现,编译器将xxmaim.obj 的call指令后的fun地址地址偏移到xx.obj中
fun的实际地址 编译成功。
再看编译器对模板的编译:
如果有通过模板创建的实体,就将模板参数带入,生成相应的二进制码。如果没有实例化,则不生成实际代码。
如果将模板分离编译,按照上面给出的步骤:
1.分别编译 因为此时xx.h,xx.cpp中都没有对模板函数的实例化,也就没有该函数的实际代码,也就没有函数的实际地址。
2.链接:在所有生成的.obj文件中都找不到函数的实际地址 链接错误
所以,因为模板分离编译时,在函数的实现文件中,没有对函数实例化,无法生成实际代码,链接时找不到函数的实际位置,出现链接失败。