模板的分离编译

模板
模板是编写与类型无关的逻辑代码(泛型编程),是复用的一种方式。
模板类形式:

 template<class/typename  形参名>;
 class  类名 
{……};

模板函数形式:

template<class/typename 形参名>;
函数类型 函数名(参数列表) 
{……}

分离编译
一个项目由多个源文件组成,每个源文件会单独编译成各自的目标文件,通过链接将各个源文件的目标文件链接成一个可执行文件的过程。

这里写图片描述

但是在编译模板程序的时候往往这样会出现错误:
这里写图片描述

这种错误是链接时错误,一般是因为声明的函数在链接时没有找到函数的实现体。
因为模板是实例化之后才会生成有效地代码,实例化之前只会检查函数的形式是否错误,不会检查模板函数体内的代码是否正确。

具体分析:
下面是给出的程序的 .h 和 .cpp 文件:

//template.h
template <class T>
class Data
{
public:
    Data();//声明函数
public:
    T year;
    T month;
};

//template.cpp
#include "template.h"
template <class T>//定义函数
Data<T>::Data()
:yera(0)
, month(0)
{
}

//main.cpp
#include "template.h"
int main()
{
    Data<int> d;//调用函数
}

在编译main.cpp文件的过程中,main.cpp知道template.h文件中对函数Data()的声明,调用Data()函数就形成一条call指令,但是这个指令指向的地址是一个错误的,当在链接的时候才可以知道Data()函数的实体是在哪个 .obj 文件中。

在此程序中Data()函数的实体定义在template.cpp文件中,但是编译的时候template.obj中没有Data()函数实体的代码,链接的时候没有找到Data()函数的实体就出现错误。

原因:在C++中,模板需经过实例化后才能生成有效地代码,这样链接的时候才不会出错。

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值