我正在尝试在Eclipse中创建链接列表类,但我无法正确编译它。
这是我的.cc文件(代码snipet)
#include <iostream>
#include "list.h"
using namespace std;
template <class T>
bool List<T>::isEmpty()
{
return (firstNode == NULL);
}
这是我的list.h文件(代码snipet)
#ifndef __LIST_H__
#define __LIST_H__
template <typename T>
class List {
public:
bool isEmpty();
private:
struct node {
node *following;
node *previous;
T *contents;
};
node *firstNode;
};
#include "list.cc"
#endif /* __LIST_H__ */
我在eclipse中尝试“建立全部”但我收到以下错误:
make all
Building file: ../list.cc
Invoking: Cross G++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"list.d" -MT"list.d" -o "list.o" "../list.cc"
../list.cc:13: error: redefinition of 'bool List<T>::isEmpty()'
../list.cc:13: error: 'bool List<T>::isEmpty()' previously declared here
make: *** [list.o] Error 1
请帮助...谢谢。我很乐意提供所需的任何澄清
编辑:我收到了.h文件,所以我知道它是正确的。我也知道我应该有一个名为list.cc的.cc文件(它包含在.h文件的末尾)答案 0 :(得分:3)
您需要使用实现更改文件的扩展名。
编译器将处理此文件以进行编译,并将对其进行两次处理,因为您将其包含在标题中。
您的文件如下所示:
#include <iostream>
#include "list.h"
using namespace std;
template <class T>
bool List<T>::isEmpty()
{
return (firstNode == NULL);
}
将成为
#include <iostream>
#ifndef __DLIST_H__
#define __DLIST_H__
template <typename T>
class List {
public:
bool isEmpty();
private:
struct node {
node *following;
node *previous;
T *contents;
};
node *firstNode;
};
#include "dlist.cc"
#endif /* __DLIST_H__ */
using namespace std;
template <class T>
bool List<T>::isEmpty()
{
return (firstNode == NULL);
}
将成为
#include <iostream>
#ifndef __DLIST_H__
#define __DLIST_H__
template <typename T>
class List {
public:
bool isEmpty();
private:
struct node {
node *following;
node *previous;
T *contents;
};
node *firstNode;
};
template <class T>
bool List<T>::isEmpty()
{
return (firstNode == NULL);
}
#endif /* __DLIST_H__ */
using namespace std;
template <class T>
bool List<T>::isEmpty()
{
return (firstNode == NULL);
}
因此函数isEmpty()
定义了两次。
将文件重命名为dlist.impl
。
答案 1 :(得分:0)
尝试将List<T>::isEmpty()
的定义放在与声明类相同的文件中。
答案 2 :(得分:0)
鉴于您提供的标头的不寻常形式,为了测试它,您将需要另一个源文件。要从新的源文件(比如test.cpp)开始,只需#include "list.h"
,它将检查是否存在任何语法错误,但尚未实例化您的List
模板。
(只需编译test.cpp,而不是list.cc,因为list.cc是test.cpp间接包含的)