Что это за ошибка?(И почему это не происходит в других классах?) - PullRequest
0 голосов
/ 28 октября 2010

Я пытаюсь написать несколько контейнерных классов для реализации первичных структур данных в C ++.Файл заголовка находится здесь:

#ifndef LINKEDLIST1_H_
#define LINKEDLIST1_H_

#include <iostream>
using namespace std;

template<class T> class LinkedList1;
template<class T> class Node;

template<class T>
class Node
{
    friend class LinkedList1<T> ;
public:
    Node<T> (const T& value)
    {
        this->Data = value;
        this->Next = NULL;
    }
    Node<T> ()
    {
        this->Data = NULL;
        this->Next = NULL;
    }
    T Data;
    Node* Next;
};

template<class T>
class LinkedList1
{
    friend class Node<T> ;
public:
    LinkedList1();
//    LinkedList1<T>();
    ~LinkedList1();
    // Operations on LinkedList
    Node<T>* First();

    int Size();
    int Count();
    bool IsEmpty();
    void Prepend(Node<T>* value); //O(1)
    void Append(Node<T>* value);
    void Append(const T& value);
    void Insert(Node<T>* location, Node<T>* value); //O(n)
    Node<T>* Pop();
    Node<T>* PopF();
    Node<T>* Remove(const Node<T>* location);
    void Inverse();
    void OInsert(Node<T>* value);
    // TODO Ordered insertion. implement this: foreach i,j in this; if i=vale: i+=vale, break; else if i<=value<=j: this.insert(j,value),break
    void print();
private:
    Node<T>* first;
    int size;
};

#endif /* LINKEDLIST1_H_ */

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

void IDS::craete_list()
{
    LinkedList1<int> lst1 = LinkedList1<int>::LinkedList1<int>();
}

эта ошибка возникает:

undefined reference to 'LinkedList1<int>::LinkedList1<int>()'

Конструктор класса является общедоступным, и его заголовочный файл включен.Я также попытался включить файл .cpp класса, но это не помогло.Я написал другие классы, такие как SparseMatrix и DynamicArray, точно так же, и ошибки не было! ...

Ответы [ 3 ]

4 голосов
/ 28 октября 2010
2 голосов
/ 28 октября 2010

Есть много замечаний, которые можно (нужно) сделать в вашем коде. Я также предполагаю, что нет никакой причины вручную реализовывать связанный список вместо использования STL, кроме домашней работы, так что подходящий тег был бы неплохим.

  • не рекомендуется использовать using namespace во включаемых файлах
  • нет никаких оснований для предварительного объявления class Node, поскольку оно следует сразу за
  • нет необходимости использовать Node<T> внутри класса, достаточно обычного Node
  • вам не нужно использовать this-> для членов данных
  • лучше и короче использовать список инициализации конструктора
  • ошибка: при использовании this->Data = NULL; вам неявно требуется, чтобы T был указателем. Просто позвольте Data быть построенным по умолчанию
  • почему Node объявляет LinkedList1 как друга, я не вижу его использования в предоставляемом вами коде?

Ваш код может выглядеть так:

#ifndef LINKEDLIST1_H_
#define LINKEDLIST1_H_

template<class T> class LinkedList1;

template<class T>
class Node
{
    friend class LinkedList1<T> ;
public:
    Node (const T& value): Data(value), Next(NULL) {}
    Node (): Next(NULL) {}
    T Data;
    Node* Next;
};
0 голосов
/ 28 октября 2010

Чтобы создать объект, сделайте так:

void IDS::craete_list()
{
    LinkedList1<int> lst1;
}

Что касается проблем компоновщика, если вы определяете свой шаблонный класс в исходном (cpp) файле, вам нужно включить его вместо заголовкафайл.

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