2017-01-16 3 views
1
template <class T>class Array 
{ 
protected : 
    T* data; 
    int size; 
}; 
template<class T>class Stack : protected Array<T> 
{ 
    int top; 
public: 
    Stack(){}; 

public: 
    void Push(T x) {data[++top] = x;} 
}; 

Почему это говорит, что данные «не были объявлены в этой области» в Push? Как я могу это исправить? Когда я удаляю каждый template<T>, он работает нормально. Что-то не так в моем шаблоне?Нельзя ссылаться на элемент базового класса в классе производных шаблонов

ответ

6

Понадобится:

template <class T>class Array 
{ 
protected : 
    T* data; 
    int size; 
}; 
template<class T>class Stack : protected Array<T> 
{ 
    int top; 
public: 
    Stack(){}; 

public: 
    // void Push(T x) {data[++top] = x;} <-- Won't compile 
    void Push(T x) {this->data[++top] = x;} // <-- Will compile 
    // void Push(T x) {Array<T>::data[++top] = x;} <-- Will also compile 
}; 

Поскольку в рамках реализации шаблона класса, полученном из шаблона класса, членов базового шаблона должны быть передан через этот указатель или с базовым классом квалификацией.

+0

Большое вам спасибо. Это полезно :))). СПАСИБО СНОВА –

+0

@ DươngNguyênĐào Добро пожаловать в Stackoverflow :) Посмотрите, как сказать «Спасибо» на SO: [Что делать, если кто-то отвечает на мой вопрос?] (Http://stackoverflow.com/help/someone-answers) –

2

В дополнение к @ ответ Майка вы можете рассмотреть возможность использования с использованием декларации:

template <class T>class Array 
{ 
protected : 
    T* data; 
    int size; 
}; 
template<class T>class Stack : protected Array<T> 
{ 
    using Array<T>::data; // <--- HERE 
    int top; 
public: 
    Stack(){}; 

public: 
    void Push(T x) {data[++top] = x;} 
}; 

Теперь data становится доступным в Stack классе.

+0

:)). это сработало :)) . большое спасибо . вы так бр :)) –

Смежные вопросы