在网上查阅得知原因是:c++编译器不支持对模板的分离式编译 首先,一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件(假定我们的平台是win32),后者拥有PE(Portable Executable,即windows可执行文件...
为什么会这样呢?这要说一下模板的特点,定义一个模板类,里面的函数只有当调用的时候才会被推演,不调用就不会进行这个推演的过程,也就是说,即使你函数里写的有问题,你编译的时候并没有调用那个函数,编译器是检查不出来的。 所以在使用模板的时候最好不要分离编译...
并不是都不支持,有少部分编译器还是支持的,比如ICC和Comeau C/C++。从标准上来说,C++标准中规定可以通过export关键字来指定模版的分离编译,但大多数编译器都没有实现。因为这个特性很难通过传统的编译-链接过程来实现,需要另外非常复杂的处理过程,编译器不得不为其单独生成一个中间代码,实现起来非...
关键是:在分离式编译的环境下,编译器编译某一个.cpp文件时并不知道另一个.cpp文件的存在,也不会去查找(当遇到未决符号时它会寄希望于连接器)。这种模式在没有模板的情况下运行良好,但遇到模板时就傻眼了,因为模板仅在需要的时候才会实例化出来,所以,当编译器只看到模板的声明时,它不能实例化该模板,只能创建一...
编译器编译一个文件时并不知道另一个文件的存在, 因此,模板代码就没有进行实例化,编译器自然不会为其生成代码,因此会抛出一个链接错误! 解决方法: 1.在模板头文件xxx.h中进行显示实例化,在模板类定义后面直接添加template class SeqList<int>;(不推荐,老版编译器可能不支持!) ...
关键是:在分离式编译的环境下,编译器编译某一个.cpp文件时并不知道另一个.cpp文件的存在,也不会去查找(当遇到未决符号时它会寄希望于连接器)。这种模式在没有模板的情况下运行良好,但遇到模板时就傻眼了,因为模板仅在需要的时候才会实例化出来,所以,当编译器只看到模板的声明时,它不能实例化该模板,只能创建一...
关键是:在分离式编译的环境下,编译器编译某一个.cpp文件时并不知道另一个.cpp文件的存在,也不会去查找[当遇到未决符号时它会寄希望于连 接器]。这种模式在没有模板的情况下运行良好,但遇到模板时就傻眼了,因为模板仅在需要的时候才会具现化出来,所以,当编译器只看到模板的声明时,它不能 具现化该模板,只能创...
//具现出来,因为在这个点上[test.cpp中],编译器知道模板的定义,所以能 //够具现化,于是,test.obj的符号导出表中就有了A<int>::f这个符号的地 //址,于是连接器就能够完成任务。 } 在分离式编译的环境下,编译器编译某一个.cpp文件时并不知道另一个.cpp文件的存在,也不会去查找[当遇到未决符号时它会寄...
关键是:在分离式编译的环境下,编译器编译某一个.cpp文件时并不知道另一个.cpp文件的存在,也不会去查找[当遇到未决符号时它会寄希望于连接器]。这种模式在没有模板的情况下运行良好,但遇到模板时就傻眼了,因为模板仅在需要的时候才会具现化出来,所以,当编译器只看到模板的声明时,它不能具现化该模板,只能创建一...
//具现出来,因为在这个点上[test.cpp中],编译器知道模板的定义,所以能 //够具现化,于是,test.obj的符号导出表中就有了A<int>::f这个符号的地 //址,于是连接器就能够完成任务。 } 在分离式编译的环境下,编译器编译某一个.cpp文件时并不知道另一个.cpp文件的存在,也不会去查找[当遇到未决符号时它会寄...