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

什么是分离编译?

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

首先,我创建了一个头文件,两个源文件:
这里写图片描述
Template.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不到函数的地址。
所以说,模板不支持分离编译。

猜你喜欢

转载自blog.csdn.net/han8040laixin/article/details/78576580