嗨,我正在尝试制作一个从C ++中的链接列表返回子列表的函数

时间:2018-07-19 20:33:57

标签: c++ linked-list

预先感谢。 我正在使用模板类,并且出现错误消息“错误C2955'列表':使用类模板需要模板参数列表”

这是我的课程列表

template <class T>
struct node{
    T Data;
    node<T> * prev;
    node<T> * next;
};

template <class T>
class List
{
public:

    node<T> * front;
    node<T> * rear;

    List();
    virtual ~List();

    bool isEmpty();
    void insertFirst(T Data);
    void insertBack(T Data);

    void insertBefore(node<T> * before, T Data);
    void insertAfter(node<T> * after, T Data);

    int removeFirst();
    int removeLast();

    void removeBefore(node<T> * before);
    void removeAfter(node<T> * after);

    node<T> * find(T Data);
    //void destroy();
    void insertRangeBefore(node<T> * before, List<T> range);
    void insertRangeAfter(node<T> * after, List<T> range);
    void removeRange(node<T> * rangeFirst, node<T> * rangeLast);
    template <class T>
    List getSublist(node<T> * rangeFirst, node<T> * rangeLast);
};

我要创建列表实例,然后返回子列表

template<class T>
    List<T> List<T>::getSublist(node<T>* rangeFirst, node<T>* rangeLast) {
        return List();
    }

1 个答案:

答案 0 :(得分:3)

template<class T>
List<T> List<T>::getSublist(node<T>* rangeFirst, node<T>* rangeLast)
//  ^^^ corrections here
{
    return List();
}

模板的{List的非限定名称仅在其定义(及其成员的定义)内等同于完全限定的名称(List<T>)。但是,这里的返回类型都不是,因此必须完全限定。

编辑您的头文件实际上并未声明此成员函数,并且您的代码仍将无法编译。您必须提供匹配声明,即

template<class T>
class List 
{
    ...    
    List getSublist(node<T>*, node<T>*);   // not a template
};

您的代码实际上声明了一个模板成员(具有另一种类型T作为模板参数)。只需从成员声明中删除行template<class T>

顺便说一句,您可能要考虑使用node的嵌套类型List<T>。然后,您可以在几乎所有地方(几乎)用node<T>替换node(除非您必须符合条件,当它是List<T>::nodetypename List<T>::node时)。