Ответ 1
Чтобы исправить это, вам нужно указать Base<T>::data_.clear()
или this->data_.clear()
. Что касается этого, см. здесь.
#include <vector>
#include <iostream>
template <class T>
class Base
{
protected:
std::vector<T> data_;
};
template <class T>
class Derived : public Base<T>
{
public:
void clear()
{
data_.clear();
}
};
int main(int argc, char *argv[])
{
Derived<int> derived;
derived.clear();
return 0;
}
Я не могу скомпилировать эту программу. Я получаю:
main.cpp:22: error: 'data_' was not declared in this scope
Пожалуйста, не могли бы вы объяснить, почему data_
не отображается в классе Derived
?
Чтобы исправить это, вам нужно указать Base<T>::data_.clear()
или this->data_.clear()
. Что касается этого, см. здесь.
В случае шаблонов компилятор не может определить, действительно ли член действительно из базового класса. Поэтому используйте указатель this
, и он должен работать:
void clear()
{
this->data_.clear();
}
Когда компилятор ищет определение класса Derived, он не знает, какая Base<T>
наследуется (поскольку T
неизвестно). Кроме того, data_
не является параметром template
или глобально видимой переменной. Таким образом компилятор жалуется на это.