在尝试编译源代码时遇到了一个奇怪的链接问题。我粘贴下面的代码以获得更好的解释。
LinkedList.h
#ifndef _LINKED_LIST
#define _LINKED_LIST
#include <iostream>
#include "ListInterface.h"
#include "Node.h"
#include "PrecondViolatedExcep.h"
template<class ItemType>
class LinkedList : public ListInterface<ItemType>{............
//There is the some code here, but thats not the point so i don't
#include "LinkedList.cpp"
#endif
的main.cpp
#include "LinkedList.h"
int main()
{
LinkedList<int> list;
}
你可以看到在 LinkedList.h 头文件下,我在底部包含了这一行#include "LinkedList.cpp
。
所以现在我可以像这样编译:
g++ main.cpp -o main
。这对我的所有程序都没有问题。
但是当我删除 LinkedList.h 头文件底部的这一行#include "LinkedList.cpp
时会出现链接问题。我编译如下:
g++ main.cpp LinkedList.cpp -o main
。从理论上讲,这应该不是问题,我大部分时间都是在其他项目中完成的。所以这个问题对我来说很奇怪。任何人都可以指出这是什么原因吗?
答案 0 :(得分:2)
我认为发生错误是因为模板类的某些方法是在LinkedList.cpp
文件上定义的。请记住,C ++为每个模板专业化编译单独的代码。
当main.cpp
使用LinkedList<int>
时,其某些方法未定义,因此链接器会抱怨它们丢失。
制作模板类时,方法的所有实体也应该在头文件中。
请read this,这似乎是你的问题。
您也可以在template class LinkedList<int>;
文件的底部添加LinkedList.cpp
,这称为explicit instantiation。
答案 1 :(得分:0)
你可能没有在LinkedList.cpp中包含LinkedList.h,所以当它自己编译时(不在main.cpp中),编译器会对main.cpp顶部定义的构造的声明进行一些假设, LinkedList.h。解析单独的LinkedList.cpp的包含,并且应该修复错误。