c++中为什么不支持模板分离编译

模板为什么不支持分离编译

通常我们习惯于将函数分离编译,即:

对于一个函数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文件中都找不到函数的实际地址 链接错误


所以,因为模板分离编译时,在函数的实现文件中,没有对函数实例化,无法生成实际代码,链接时找不到函数的实际位置,出现链接失败。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值