C ++与gcc编译器的奇怪链接错误

时间:2016-02-17 03:17:26

标签: c++ linker-errors

在尝试编译源代码时遇到了一个奇怪的链接问题。我粘贴下面的代码以获得更好的解释。

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。从理论上讲,这应该不是问题,我大部分时间都是在其他项目中完成的。所以这个问题对我来说很奇怪。任何人都可以指出这是什么原因吗?

2 个答案:

答案 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的包含,并且应该修复错误。