这个错误是什么? (为什么不在其他类中出现?)

时间:2010-10-28 08:24:00

标签: c++ mingw

我正在尝试编写一些容器类来实现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>()'

该类的构造函数是public,包含其头文件。我也尝试包含该类的.cpp文件,但这没有帮助。我以完全相同的方式写了其他类,如SparseMatrix和DynamicArray,没有错误!...

3 个答案:

答案 0 :(得分:4)

答案 1 :(得分:2)

可以(应该)对您的代码进行许多评论。我还假设没有理由手动实现链表而不是使用STL而不是作业,所以合适的标签会很好。

  • 建议不要在包含文件中使用using namespace
  • 没有理由直接宣告class Node紧随其后
  • 无需在课程中使用Node<T>,常规Node就够了
  • 您不需要将this->用于数据成员
  • 它更好&amp;更短的使用构造函数初始化列表
  • bug:使用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;
};

答案 2 :(得分:0)

要创建对象,请执行以下操作:

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

对于链接器问题,如果在源(cpp)文件中定义模板类,则需要包含它而不是头文件。