C++ 如何在Eclipse中编译模板类(C+;+;)?

C++ 如何在Eclipse中编译模板类(C+;+;)?,c++,eclipse,compilation,C++,Eclipse,Compilation,我正试图在Eclipse中创建一个链表类,但无法正确编译它 这是我的.cc文件(代码snipet) #包括 #包括“list.h” 使用名称空间std; 模板 bool List::isEmpty() { 返回(firstNode==NULL); } 这是我的list.h文件(代码snipet) \ifndef\uu列表__ #定义列表__ 模板 班级名单{ 公众: bool是空的(); 私人: 结构节点{ 节点*跟踪; 节点*先前; T*内容; }; 节点*第一个节点; }; #包括“lis

我正试图在Eclipse中创建一个链表类,但无法正确编译它

这是我的.cc文件(代码snipet)

#包括
#包括“list.h”
使用名称空间std;
模板
bool List::isEmpty()
{
返回(firstNode==NULL);
}
这是我的list.h文件(代码snipet)

\ifndef\uu列表__
#定义列表__
模板
班级名单{
公众:
bool是空的();
私人:
结构节点{
节点*跟踪;
节点*先前;
T*内容;
};
节点*第一个节点;
};
#包括“list.cc”
#endif/*\uuu列表\u H\uu*/
我尝试在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
makeall
生成文件:../list.cc
调用:跨G++编译器
g++-O0-g3-Wall-c-fmessage length=0-MMD-MP-MF“list.d”-MT“list.d”-o“list.o”“../list.cc”
../list.cc:13:错误:“bool list::isEmpty()的重新定义”
../list.cc:13:错误:“bool list::isEmpty()”之前在此处声明
make:**[list.o]错误1
请帮忙……谢谢。我很乐意提供所需的任何澄清


编辑:我得到了.h文件,所以我知道它是正确的。我还知道我应该有一个名为list.cc的.cc文件(它包含在.h文件的末尾)

尝试将
list::isEmpty()
的定义放在声明类的同一个文件中。

尝试将
list::isEmpty()的定义放在同一个文件中
与声明的类位于同一文件中。

您需要随实现更改文件的扩展名

编译器将处理此文件进行编译,并将处理它两次,因为您将其包含在头中

您的文件如下所示:

#include <iostream>
#include "list.h"

using namespace std;

template <class T>
bool List<T>::isEmpty()
{
    return (firstNode == NULL);
}
#包括
#包括“list.h”
使用名称空间std;
模板
bool List::isEmpty()
{
返回(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);
}
#包括
#如果没有__
#定义列表__
模板
班级名单{
公众:
bool是空的();
私人:
结构节点{
节点*跟踪;
节点*先前;
T*内容;
};
节点*第一个节点;
};
#包括“dlist.cc”
#endif/*\uuu数据列表\uh\uu*/
使用名称空间std;
模板
bool List::isEmpty()
{
返回(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);
}
#包括
#如果没有__
#定义列表__
模板
班级名单{
公众:
bool是空的();
私人:
结构节点{
节点*跟踪;
节点*先前;
T*内容;
};
节点*第一个节点;
};
模板
bool List::isEmpty()
{
返回(firstNode==NULL);
}
#endif/*\uuu数据列表\uh\uu*/
使用名称空间std;
模板
bool List::isEmpty()
{
返回(firstNode==NULL);
}
因此函数
isEmpty()
定义了两次


将文件重命名为
dlist.impl

您需要随实现更改文件的扩展名

编译器将处理此文件进行编译,并将处理它两次,因为您将其包含在头中

您的文件如下所示:

#include <iostream>
#include "list.h"

using namespace std;

template <class T>
bool List<T>::isEmpty()
{
    return (firstNode == NULL);
}
#包括
#包括“list.h”
使用名称空间std;
模板
bool List::isEmpty()
{
返回(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);
}
#包括
#如果没有__
#定义列表__
模板
班级名单{
公众:
bool是空的();
私人:
结构节点{
节点*跟踪;
节点*先前;
T*内容;
};
节点*第一个节点;
};
#包括“dlist.cc”
#endif/*\uuu数据列表\uh\uu*/
使用名称空间std;
模板
bool List::isEmpty()
{
返回(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);
}
#包括
#如果没有__
#定义列表__
模板
班级名单{
公众:
bool是空的();
私人:
结构节点{
节点*跟踪;
节点*先前;
T*内容;
};
节点*第一个节点;
};
模板
bool List::isEmpty()
{
返回(firstNode==NULL);
}
#endif/*\uuu数据列表\uh\uu*/
使用名称空间std;
模板
bool List::isEmpty()
{
返回(firstNode==NULL);
}
因此函数
isEmpty()
定义了两次


将文件重命名为
dlist.impl

鉴于提供的头文件格式不寻常,要对其进行测试,您需要另一个源文件。从新的源文件(比如test.cpp)开始,只需
#包括“list.h”
,这将检查语法错误,但不会实例化
列表
模板


(只需编译test.cpp,而不是list.cc,因为list.cc间接包含在test.cpp中)

鉴于提供给您的头文件格式不同寻常,要测试它,您需要另一个源文件。从新的源文件(比如test.cpp)开始,只需
#包括“list.h”
,这将检查语法错误,但不会实例化
列表
模板


(只需编译test.cpp,而不是list.cc,因为list.cc是test.cpp间接包含的)

这确实解决了问题,但没有解决问题的原因。看看我的答案。你是对的,我应该提供一个更详细的原因来解释为什么会发生这种情况。我也投了你一票。这确实解决了问题,但没有解决问题的原因。看看我的答案。你是对的,我应该提供一个更详细的原因来解释为什么会发生这种情况。我也向你投了赞成票。可能是重复的,请尝试使
isEmpty
内联或静态。@nosretap,文件名是什么?是
list.cc
还是
dlist.cc
?在问题中,您需要非常清楚实际的文件名是什么
list.h
dlist.h
?@Aaron McDaid,很抱歉。一切都应该列在清单上,但我认为这不是问题所在。我已经做了相应的更改,可能重复了Try making
isEmpty
inline或static。@NoRettap,文件名是什么?是
list.cc
还是
dlist.cc
?你需要非常清楚