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

什么是分离编译?

分离编译模式是指:一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件连接起来形成单一的可执行文件的过程。

首先,我创建了一个头文件,两个源文件:
这里写图片描述
SeqList.h里写声明
Template.cpp里放定义
test.cpp里做测试
这里写图片描述
这里写图片描述

这里写图片描述
如图,这里调用了Func1函数。
这是一个很简单的例子,我拿它来举例:
这里写图片描述
如图,在预处理阶段,头文件已经展开,两个.cpp文件已经变成:
这里写图片描述
然后两个文件各自编译,一直到链接前互不相交。
这里写图片描述

但是看这个程序:

//Template.h
template <class T>
void Func2(const T& x);

//Template.cpp
```template <class T>
void Func2(const T& x)
{
    cout << x << endl;
}

//test.cpp
void test()
{
    Func2(10);
}

int main()
{
    test();
    return 0;
}

但是却发生了链接错误:
这里写图片描述

错误的原因:
编译器在“预编译阶段”会将#include包含的文件拷贝进当前test.cpp文件中,随后test文件里就会有模板的声明,而模板只有在实例化时才会生成代码,Func2(10)做到了实例化,但是Template.cpp却没有模板的实例化,所以链接时,call不到函数的地址。
所以说,模板不支持分离编译。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值