C ++:关于链表的实现

时间:2012-10-08 01:29:29

标签: c++ templates linked-list

我继续为我的一个函数收到编译器错误。

LinkedList.hpp:81: error: `template<class T> class LinkedList' used without template parameters
LinkedList.hpp:81: error: expected constructor, destructor, or type conversion before '*' token
LinkedList.hpp:81: error: expected `;' before '*' token

但问题是我有构造函数,析构函数和类型转换。我很确定实施是错误的

// This is the function i keep on getting an error for
template <class T>
ListNode* LinkedList<T>::find(int pos)//Finds the position of an item
{
    if(pos < 1)
        return NULL; //If pos is less than one then find returns NULL because pos is a illegal value.
    else
    {
        ListNode *temp = head;
        for(int i = 1; i < pos; i++)
            temp = temp -> next;
        return temp;
    } 
}

//The class 
template <class T>
class LinkedList : public ABCList<T> {
private:
    //T    a [LIST_MAX];

    struct ListNode
    {
        T data; // List item
        ListNode *next; //Pointer to next node
    };

    int  size;
    ListNode *head;
    ListNode *find(int pos);

public:
    LinkedList();
    LinkedList(LinkedList &other);
    ~LinkedList();
    virtual bool isEmpty () = 0;
    virtual int  getLength () = 0;
    virtual void insert (int pos, T item) = 0;
    virtual T    remove (int pos) = 0;
    virtual T    retrieve (int pos) = 0;
};

2 个答案:

答案 0 :(得分:2)

  1. 为什么在标准库提供链表时创建链表? std::list是双重链接列表。
  2. 您可以在ListNode*定义
  3. 中将typename LinkedList<T>::ListNode*重写为find()吗?
  4. 您必须选择是否希望用户能够操作ListNode,(在这种情况下,您应该将其声明为公共),或者它是否是实现的一部分(在这种情况下,您可能想要创建某种迭代器。)

  5.   

    我仍然遇到同样的错误

    find()的定义是否位于LinkedList类声明的顶部,如问题中所示?如果是这种情况,你应该交换它们。

答案 1 :(得分:1)

我看到的一件事是ListNode是在LinkedList中定义的,因此必须以这种方式进行限定:

template <class T>
typename LinkedList<T>::ListNode* LinkedList<T>::find(int pos) {
    ...
}