使用模板的C ++链接列表

时间:2012-06-19 19:42:26

标签: c++ templates generics

我想使用模板在c ++中创建自己的链表实现。但是,我遇到了几个编译器错误。这是代码:

template <class T>
class Node{
T datum;
Node _next = NULL;
 public:
 Node(T datum)
{
    this->datum = datum;
}
 void setNext(Node next)
 {
     _next = next;
 }
 Node getNext()
 {
     return _next;
 }
 T getDatum()
 {
     return datum;
 }          
};
template <class T>
class LinkedList{
Node<T> *node;
Node<T> *currPtr;
Node<T> *next_pointer;
int size;
public:
LinkedList(T datum)
  {
      node = new Node<T>(datum);
      currPtr = node;  //assignment between two pointers.
      size = 1;
  }
void add(T datum)
 {
   Node<T> *temp = new Node<T>(datum);
   (*currPtr).setNext((*temp));
   currPtr = temp;       
   size++;
 }
T next()
{
   next_pointer = node;
   T data = (*next_pointer).getDatum();
   next_pointer = (*next_pointer).getNext();
   return data;
}
int getSize()
{
   return size;
}   
};

当我尝试实例化这个类时,我遇到了以下错误:

LinkedList.cpp: In instantiation of `Node<int>':
LinkedList.cpp:35:   instantiated from `LinkedList<T>::LinkedList(T) [with T = int]'
LinkedList.cpp:60:   instantiated from here
LinkedList.cpp:7: error: `Node<T>::_next' has incomplete type
LinkedList.cpp:5: error: declaration of `class Node<int>'
make[2]: *** [build/Debug/Cygwin-Windows/LinkedList.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

我正在使用NetBeans IDE。有人可以给我一些改进的建议吗?非常感谢!!

4 个答案:

答案 0 :(得分:1)

除了语法错误之外:

class Node{
T datum;
Node _next = NULL;
//....

您不能拥有与会员相同类型的会员。您可以使用指针:

template <class T>
class Node{
T datum;
Node<T>* _next;

并在构造函数中设置它(因为=NULL在那里不合法)。

相关:Why is a class allowed to have a static member of itself, but not a non-static member?

答案 1 :(得分:1)

您的Node课程应该包含指针到下一个Node,而不是直接Node。这里有一个递归类型,编译器无法处理。

另一个错误是您无法初始化此类成员。你必须在构造函数中这样做。

因此,请Node _next = NULL;替换Node *_next;,并在构造函数中将指针_next初始化为nullptr

答案 2 :(得分:1)

可能只是这一行:

Node _next = NULL;

你真的需要它成为一个指针(Node<T>* _next)。如果一个类包含自己类型的实例,则该实例将拥有自己的该类型实例,依此类推 ad memorum exhaustum

答案 3 :(得分:1)

就像在Node<T> *node;中执行LinkedList时一样,您还需要在Node班级中执行相同操作

template <class T>
class Node{
    T datum;
    Node<T> *_next;//template parameter
                   //also, need to make this a pointer and initialized in constructor
public:

//...
    void setNext(Node<T> next) //template parameter
    {
        _next = next;
    }
    Node<T> getNext() //template parameter
    {
        return _next;
    }
//...
};