@Tolstohabr

Что не так с наследованием?

Вот сделал я шаблон класса.
//базовый класс
template <class T>
class mnoj
{
protected:
    T* mas;
    int index;
    int size;
public:
    mnoj(int n = 0) {
        index = n;
        size = 10;
        mas = new T[size];
        for (int i = 0; i < size; i++) {
            mas[i] = 0;
        }
    }
    ~mnoj() {
        delete[] mas;
    }
...};

Потом сделал наследника
//класс наследник
template <class T>
class mnoj1 : public mnoj<T>
{
public:
    void f11(char a);
};

template<class T>
void mnoj1<T>::f11(char a) {
    char b = a;
    for (int i = 0; i < index; i++) {
        if (mas[i].name == b) {
            mas[i].pass();
        }
    }
}

Но компилятор говорит про index и mas необъявленный идентификатор
Вроде нужно сделать конструктор в наследнике, но я не знаю как сделать правильно.
Может кто-нибудь поможет?
  • Вопрос задан
  • 125 просмотров
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C++
Т.к. и базовый класс и класс-наследник являются шаблонными, то компилятор C++ считает, что члены класса mnoj являются так называемыми "зависимыми идентификаторами" (dependent names). Такие идентификаторы по-умолчанию не включаются в процесс разрешения имён и их нужно "затаскивать" в него явно.

Вариант 1 (советую его): обращаться к полям базового класса через this: this->index - это вообще хорошая практика - сразу видно, где используется локальная переменная, а где идёт работа с состоянием объекта.
Вариант 2: использовать using mnoj<T>::index; и using mnoj<T>::mas внутри описания класса mnoj1.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы