> 文章列表 > 模板的分离编译

模板的分离编译

模板的分离编译

目录 :

        1.分离编译概念

        2.模板是不支持分离编译的

        3.报链接错误的原因

        4.如何解决

-----------------------------------------------------------------------------------------------------------------------

1.分离编译概念

一个程序由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译

2.模板是不支持分离编译的

我们先尝试一下将模板声明定义分离  (用vector来尝试)(模板的声明和定义是非常不容易的)

我们仅仅先将vector模板中的push_back 、 insert函数进行声明和定义分离

 我们在vector.cpp函数的定义

 那么在什么时候我们需要加typename呢???

我们在指定一个还没有实例化的模板 (这里的vector<T>就是还没有实例化的模板),然后我们要取里面的内嵌类型

 我们就需要加typename,不加typename编译器区分不了这里是一个类型还是一个变量

对于静态变量我们指定类域也能这么访问

----------------------------------------------------------------------------------------------------------------

编译能通过后我们运行我们的test.cpp,发现报错了,报了一个链接错误

 3.报链接错误的原因

最主要的原因是因为push_back定义和声明分离了,这里insert没有报的原因是因为insert没有被调用

链接问题主要还是因为,有声明找不到定义

 

 push_back、insert不一样,这两个函数在vector.h中只有声明,没有定义,那么地址只能在链接阶段去确认了(这里的报错说名链接阶段找不到)

 链接是去符号表找地址,可为什么在符号表也找不到push_back 、 insert 的地址呢??

 4.如何解决

1.定义和声明不分离(不分离到.h和.cpp)

2.在.cpp显示实例化(不推荐,太麻烦,换一个类型就要显示实例化)