链接器错误 - 未定义的引用

时间:2014-04-22 16:42:56

标签: c++ linker

是的,我知道之前已经问了十亿次,我已经检查过这个问题的至少100个副本,但仍然没有找到答案。

我的所有undefined reference函数都出现LList错误,尽管它们似乎都已正确定义和链接。由于我的代码有点太长而无法在此处粘贴,因此我制作了一个馅饼: Click

我用g++ driver.cpp box.cpp LList.cpp Song.cpp Album.cpp -o driver

编译我的代码

2 个答案:

答案 0 :(得分:2)

一个类或函数template 一个类或函数,因此不能放在.cpp文件中,如类或函数。相反,template蓝图,用于创建类或函数,即模板的特定即时

您可以通过两种方式解决问题:

1 将所有模板化代码放在相应的头文件中。

2 或在.cpp文件中明确显示代码。例如

// Llist.cpp
#include Llist.hpp
#include Sonc.hpp

/* definition of members of Llist<> */

template class Llist<Song>;   // creates class Llist<Song> 

解决方案 1 始终有效,但有可能存在HUGE头文件,并向用户公开所有(或大多数)实现细节。解决方案 2 避免使用大量标头并隐藏实现细节,但要求您知道实际需要的即时性(通常是不可能的,特别是对于链接列表等一般概念)。

最后,解决方案 3 :使用C ++标准库(std::liststd::forward_list)并且不用担心。

答案 1 :(得分:1)

必须内联定义模板类和函数。那就是问题所在。例如:

//box.h
#ifndef BOX_H
#define BOX_H

template <typename DataType>
struct box
{
        DataType data;
        box<DataType> *next;
        box(DataType d, box<DataType>* n)
        {
                data = d;
                next = n;
        }
};

#endif

删除.cpp文件;你应该对LList.h / cpp

做同样的事情