关于undefined reference to——C++模板类文件组织方式

来源:互联网 发布:淘宝助理线上回收站 编辑:程序博客网 时间:2024/05/17 08:33

转载自:http://kyleven.blog.163.com/blog/static/733813072010102444930449/

        今天在实现一个Lock Free的vector时,因为vector的实现方式采用了template的方式实现(后续文章会展示Lock Free的vector的具体实现代码!),在编译的时候出现了如下图中的问题,按照这篇文章的方法解决了问题。但是原理究竟是什么,还不清楚,需要了解编译连接的详细过程!


        以前有人问过我C++的.h文件和.cpp文件的组织方式,当时很随口的回答,.h中是类的声明,.cpp中是类的实现。最近要实现简单二叉树结构,所以用到队列类,我以queue.h,queue.cpp,最后用main.cpp作为测试文件,queue.cpp中#include "queue.h",并在main.cpp中#include "queue.h",想来这是常规的文件组织方式,不会错的。结果却是构建(编译通过,链接错误)过程中出现undefined reference to 一些queue中的方法。显然,编译器找不到该类中的方法。


解决方法一,在main.cpp中#include "queue.cpp",而非"queue.h",这种方式就如同将队列类的声明实现放在同一文件中。
解决方法二,在queue.h中,代码部分结尾处#include "queue.cpp",并且去掉queue.cpp里的包含语句,这与上述方式如出一辄,只是在main.cpp中看上去就像习惯中的方案一样。
解决方法三,声明类时,在类名前加上export关键字,抱歉如今的c++编译器中这关键字多半行不通。就像foreach之类的关键字一样,多半会被认为是关键字,但是却是编译器不认识的。
综上,因为C++模板类中的处理方法不一样,因为需要传入参数才能确定内存如何分配,所以编译完成时并没有解决所有问题,在main.o中便会,找不到它需要用到的方法了。



0 0
原创粉丝点击