Rıfat Tolga Kiran
Rıfat Tolga Kiran

Reputation: 245

template class inheritance gives unknown variable error

I created an abstract class which is named "list" and i inherited "list" class to create a queue and a stack. But when i tried to compile the code, i got errors which is pointing that "tail, head , next" are not recognised or unknown.

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

i have created an abstract class which is named "list" and i inherited "list" class to create a queue and a stack. But when i tried to compile the code, i got errors which is pointing that "tail, head , next" are not recognized or unknown.

error is below:

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

Upvotes: 1

Views: 98

Answers (1)

πάντα ῥεῖ
πάντα ῥεῖ

Reputation: 1

Explicitly refer to the base class scope to access the inherited member variables:

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

Access via this can be used alternatively:

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

Upvotes: 2

Related Questions