【c++】模板为什么不支持分离编译
来源:互联网 发布:vb.net app.path 编辑:程序博客网 时间:2024/05/16 09:19
我们在写代码的时候,通常情况下我们定义.h文件.cpp。我们把函数的声明放在.h文件中,函数定义放在.cpp中。
【什么是分离编译】
分离编译模式是指:一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件连接起来形成单一的可执行文件的过程。
//Test.hvoid fun();//函数声明//Test.cpp#include"Test,h"void fun()//函数实现/定义{ ...}//test.cint main(){ fun();//函数调用}
【分离编译的优点】
1,有错误时可以快速找到
2,实现模块多用
下来我么你看看模板的分离编译会怎么样!
//Test.htemplate <class T>class AA{public: AA();private: int _a;};//Test.cpp#include"Test.h"template<class T>AA<T>::AA() :_a(0) {}main.cpp//主函数#include"Test.h"int main(){ AA<int> a1; return 0;}
当我们运行程序时:
我们看到出了一个链接错误!
注意:链接错误通常是找不到函数的实现体
首先我们先了解下编译器对我们代码总共做了哪些事!
分析:
编译器在“预编译阶段”会将#include包含的文件拷贝进当前main.cpp文件中,那么经过预编译阶段后main文件中便会包含模板的声明,在“编译阶段”main文件中的AA a1相当于告诉编译器要将模板类实例化为AA类型,但是当模板分离编译时,此时main文件中只会实例化出fun()函数的声明,而Test.cpp中fun()函数的定义并不会实例化,所以当在“链接阶段”符号表的重定位时并不会找到fun()函数的地址。所以出现无法解析外部符号的错误.
我们模板代码的实现体在一个文件里,而实例化模板的测试代码在另一个文件里,编译器编译一个文件时并不知道另一个文件的存在,因此,模板代码就没有进行实例化,编译器自然不会为其生成代码,因此会抛出一个链接错误!
阅读全文
0 0
- 【C++】为什么模板不支持分离编译
- 【c++】模板为什么不支持分离编译
- c++:为什么模板不支持分离编译?
- 为什么模板不支持分离编译?
- 为什么模板不支持分离编译?
- 为什么模板不支持分离编译
- 为什么模板不支持分离编译
- 为什么模板不支持分离编译
- 为什么模板不支持分离编译?
- 为什么模板不支持分离编译
- 为什么模板不支持分离编译
- 为什么模板不支持分离编译?
- 模板为什么不支持分离编译
- 为什么模板不支持分离编译
- 模板为什么不支持分离编译?
- C++ 中为什么模板不支持分离编译?
- 模板究竟为什么不支持分离编译呢?!!!
- C++中模板为什么不支持分离编译
- mysql主从复制与读写分离
- Android学习之本地广播的使用
- 【QT】Qt 5.9 QWidget程序执行过程分析
- 球冠面积
- 欢迎使用CSDN-markdown编辑器
- 【c++】模板为什么不支持分离编译
- leetcode--Triangle
- ajax常见问题总结一
- phpstorm设置内存限制的方法
- CentOS 6.X RPM安装mysql 5.7.X
- 合同诈骗行为的表现形式
- HDU.1796 How many integers can you find ( 组合数学 容斥原理 二进制枚举)
- PHP 安全的电子邮件
- token登录验证机制图解