2016-12-22 3 views
1

"list"という抽象クラスを作成し、 "list"クラスを継承してキューとスタックを作成しました。しかし、私がコードをコンパイルしようとすると、 "tail、head、next"が認識されていない、または未知であることを指摘しているエラーが出ます。テンプレートクラスの継承が不明な変数エラーを返します

#include <iostream> 
#include <cstdlib> 

using namespace std; 

template <typename T> 
class list{ 
public: 
    T data; 
    list<T> * head; 
    list<T> * tail; 
    list<T> * next; 
    list(){head = tail = next = NULL;} 
    virtual ~list(){} 
    virtual void store(T) = 0; 
    virtual T retrieve() = 0; 
}; 

// QUEUE 
template <typename T> 
class queue : public list<T>{ 
public: 
    virtual void store(T); 
    virtual T retrieve(); 
}; 

template <typename T> 
void queue<T>::store(T d){ 
    list<T> * temp = new queue<T>; 
    if (!temp) exit(EXIT_FAILURE); 

    temp->data = d; 
    temp->next = NULL; 

    if(tail){ 
     tail->next = temp; 
     tail = temp; 
    } 

    if(!head) head = tail = temp; 

} 

template <typename T> 
T queue<T>::retrieve(){ 
    T i; 
    list<T> * temp; 

    i = head->data; 
    temp = head; 
    head = head->next; 

    delete temp; 

    return i; 
} 



// STACK 
template <typename T> 
class stack : public list<T>{ 
public: 
    virtual void store(T i); 
    virtual T retrieve(); 
}; 

template <typename T> 
void stack<T>::store(T d){ 
    list<T> * temp = new stack<T>; 
    if(!temp) exit(EXIT_FAILURE); 

    temp->data = d; 

    if (tail) temp->next = tail; 
    tail = temp; 
    if(!head) head = tail; 

} 

template <typename T> 
T stack<T>::retrieve(){ 
    T i; 
    list<T> * temp; 

    i = tail->data; 
    temp = tail; 
    tail = tail->next; 

    delete temp; 

    return i; 
} 




int main(){ 

    queue<int> mylist; 

    for(int i = 0; i < 10; i++) 
     mylist.store(i); 

    for(int i = 0; i < 10; i++) 
      cout << mylist.retrieve() << endl; 
} 

"list"という名前の抽象クラスを作成し、 "list"クラスを継承してキューとスタックを作成しました。しかし、私がコードをコンパイルしようとすると、 "tail、head、next"が認識されていない、または未知であることを指摘しているエラーが出ます。

誤差は以下である:

..\main.cpp: In member function 'virtual T stack<T>::retrieve()': 
..\main.cpp:86:6: error: 'tail' was not declared in this scope 
+0

をエラーメッセージを記述して貼り付けないでください。 –

答えて

2

は、明示的に継承されたメンバ変数にアクセスするために、基本クラスの範囲を参照してくださいthis介し

if(list<T>::tail){ 
// ^^^^^^^^^ 
    list<T>::tail->next = temp; 
// ^^^^^^^^^ 
    list<T>::tail = temp; 
// ^^^^^^^^^ 
} 

アクセスを代わりに使用することができる。

if(this->tail){ 
// ^^^^^^ 
    this->tail->next = temp; 
// ^^^^^^ 
    this->tail = temp; 
// ^^^^^^ 
} 
+0

変数を明示的に書く必要がある理由を説明できますか?基底クラスを継承しているので、すでに定義しています。 –

+0

@RıfatTolgaKiranコンパイラによると、現在のスコープでは宣言されていませんでした。代わりに 'this->'を使うことができます。 –

+1

お返事ありがとうございます。彼らは私が多くを理解するのを助けました。 –

関連する問題