Подтвердить что ты не робот

Защищенный член "не объявлен в этой области" в производном классе

#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?

4b9b3361

Ответ 1

Чтобы исправить это, вам нужно указать Base<T>::data_.clear() или this->data_.clear(). Что касается этого, см. здесь.

Ответ 2

В случае шаблонов компилятор не может определить, действительно ли член действительно из базового класса. Поэтому используйте указатель this, и он должен работать:

void clear()
{
   this->data_.clear();
}

Когда компилятор ищет определение класса Derived, он не знает, какая Base<T> наследуется (поскольку T неизвестно). Кроме того, data_ не является параметром template или глобально видимой переменной. Таким образом компилятор жалуется на это.