模板类继承给出未知的变量错误

时间:2016-12-22 15:11:12

标签: c++ templates inheritance

我创建了一个名为“list”的抽象类,并且我继承了“list”类来创建队列和堆栈。但是当我试图编译代码时,我得到的错误指出“尾,头,下”不被识别或未知。

#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”类来创建队列和堆栈。但是当我试图编译代码时,我得到的错误指出“尾巴,头部,下一个”未被识别或未知。

错误如下:

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

1 个答案:

答案 0 :(得分:2)

显式引用基类范围以访问继承的成员变量:

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

可以选择通过this进行访问:

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