0

これが私の問題です。

次のような Linked List クラスがあります。

#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
    //////
};

次に、次のように LList から継承する SortedLList というクラスがあります。

#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 に答える