Как скомпилировать шаблонный класс (C ++) в Eclipse? - PullRequest
0 голосов
/ 29 января 2012

Я пытаюсь создать класс связанного списка в Eclipse, но не могу заставить его правильно скомпилироваться.

Вот мой файл .cc (фрагмент кода)

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

using namespace std;

template <class T>
bool List<T>::isEmpty()
{
    return (firstNode == NULL);
}

и вот мой файл list.h (фрагмент кода)

#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__ */

Я пытаюсь «Создать все» в затмении, но получаю следующую ошибку:

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, так что я знаю, что это правильно. Я также знаю, что у меня должен быть файл .cc с именем list.cc (он включен в конец файла .h)

Ответы [ 3 ]

3 голосов
/ 29 января 2012

Вам нужно изменить расширение файла с реализацией.

Компилятор обработает этот файл для компиляции и обработает его дважды, поскольку вы включаете его в заголовок.

Ваш файл выглядит так:

#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.

0 голосов
/ 29 января 2012

Учитывая необычную форму заголовка, который вы поставили, для его проверки вам потребуется другой исходный файл. Начать с нового исходного файла (скажем, test.cpp) можно просто #include "list.h", который проверит любые синтаксические ошибки, но пока не создаст экземпляр вашего List шаблона.

(просто скомпилируйте test.cpp, а не list.cc, поскольку list.cc косвенно включен в test.cpp)

0 голосов
/ 29 января 2012

Попробуйте поместить определение для List<T>::isEmpty() в тот же файл, в котором объявлен класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...