0

这是我的问题。

我有一个链接列表类,如下所示:

#include <iostream>
#include "List.h"
template <class Elem>
class LList : public List<Elem> { //List is a virtual base class
protected:

    Node <Elem> *head;
    Node <Elem> *fence;
    Node <Elem> *tail;

    int leftCount; 
    int rightCount;
    void init();
    void removeAll(); 

public:
    LList(); 
    ~LList();
    //Rest of methods overridden from List class
    //////
};

然后我有一个名为 SortedLList 的类,它继承自 LList,如下所示:

#include "LinkedList.h"
#include "Helper.h"
template <class Elem> 
class SortedLList : public LList<Elem> {
protected:

    Helper *helper;
public:

    SortedLList();
    ~SortedLList();
    bool insert(const Elem&); //Override insertion method from LList class
};

在 SortedLList (SortledLList.cpp) 的实现中:

#include "SortedLList.h"
template <class Elem>
SortedLList<Elem>::~SortedLList() {
    removeAll();
}

template <class Elem>
bool SortedLList<Elem>::insert(const Elem &_e) {
    fence = head;
    //Rest of Code..
}

我有一个编译器错误,上面写着:使用未声明的标识符 removeAll()。栅栏和头指针也没有被识别。我做错什么了?

谢谢你。

4

1 回答 1

2

因为您的类是一个模板,所以某些问题可能会使编译器感到困惑。您可能认为您的代码直截了当且易于理解,在这种情况下确实如此。较旧的编译器过去常常尽力猜测和编译此代码。

但是,较新的编译器更加严格,并且在此类代码的所有版本上都失败了,以防止程序员依赖它。

您需要做的是this在调用基类函数时使用指针。这使得通话清晰明了。那看起来像this->removeAll()

另一种选择是使用全名限定,如LList<Elem>::removeAll(). 我更喜欢使用this,因为它更容易阅读。

于 2013-09-25T20:37:43.990 回答