是的,我知道之前已经问了十亿次,我已经检查过这个问题的至少100个副本,但仍然没有找到答案。
我的所有undefined reference
函数都出现LList
错误,尽管它们似乎都已正确定义和链接。由于我的代码有点太长而无法在此处粘贴,因此我制作了一个馅饼: Click
我用g++ driver.cpp box.cpp LList.cpp Song.cpp Album.cpp -o driver
答案 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::list
,std::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
做同样的事情