模板显式实例化 explicit template instantiation

众所周知,C++中模板的声明与定义分离时,需要使用显式实例化,否则就会出现链接错误。这个星期的程设作业中就出现了显式实例化,而且是TA为我们先写好的,我一开始也没在意,后来有人问到了这个问题,我才知道如果不写上的话会导致链接错误,于是搜索了一下原因,发现很少对原因有解释,于是打算讲一下我的理解。

http://www.cplusplus.com/forum/articles/14272/

首先感谢这篇文章的作者,我也是看了它才明白。

要理解这个问题,首先需要知道编译器是怎么处理template的。其实template跟普通的东西没什么区别,只是增加了一些参数,只是这些参数甚至可以是类型名而已,而编译器在编译时必须把模板实例化成具体的东西,这样才能被正常地调用(模板是编译时多态,不能在运行时再来根据参数类型进行调用,原因目前我还不知道)。实例化的过程,就是为可能将要用到的模板参数分别编译出这个模板的一个实例,类型的推断则由编译器对类型进行推断完成,比如int a, b; cmp(a, b); 那么编译器就会知道我们将要使用cmp<int>,然后帮我们把typename的参数都替换成int,编译出一个函数。

如果我们把实现与声明写在一起,那么定义也随之被include到了需要调用这个模板的地方,那么可以正常编译。问题就出现在我们把实现与声明写在.h和.cpp文件中的时候,当编译器编译实现文件时,里面只有定义而没有对模板的调用(文件之间是独立编译再链接的&#

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值