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

时间:2012-01-29 17:46:22

标签: c++ eclipse compilation

我正在尝试在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文件的末尾)

3 个答案:

答案 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间接包含的)