Я написал базовый класс шаблона, как показано ниже:

template<typename T>
class Base {
public:
    Base(T x);
    void print_base();
    virtual ~Base();
protected:
    T data;
};

template<typename T>
Base<T>::Base(T x) : data(x) {}

template<typename T>
void Base<T>::print_base()
{
    std::cout << data << std::endl;
}

template<typename T>
Base<T>::~Base() {}

Теперь я пытаюсь написать производный класс, как показано ниже:

template<typename T>
class Derived : public Base<T>
{
public:
    Derived(T x);
    void print_derived();
private:
};

template<typename T>
Derived<T>::Derived(T x) : this->Base(x) {}

template<typename T>
void Derived<T>::print_derived()
{
    this->print_base();
    std::cout << " data " << this->data << std::endl;
}

Но компилятор сообщает об ошибке в следующей строке:

template<typename T>
Derived<T>::Derived(T x) : this->Base(x) {}

Ошибка выглядит так:

template_derived_class_this.h:12:28: error: expected identifier before 'this'
 Derived<T>::Derived(T x) : this->Base(x) {}

Если я изменю его на ниже, ошибка исчезнет:

 Derived<T>::Derived(T x) : Base<T>::Base(x) {}

У меня вопрос: в чем причина ошибки в формате префикса this-> ? Это потому, что до того, как конструктор завершит выполнение, указатель this еще не готов, или я делаю здесь синтаксическую ошибку? Я видел, как this-> использовался внутри конструктора где-то еще. Так что не уверен, в чем причина ошибки в моем случае. Я компилирую с помощью следующей команды:

g++ template_inheritance_main_this.cpp -o template_inheritance_main_this  -Wall
  -Wextra -Wpedantic -Werror
0
VivekB 20 Май 2021 в 14:01

1 ответ

Лучший ответ

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

template<typename T>
Derived<T>::Derived(T x) : Base<T>(x) {}
2
ostojan 20 Май 2021 в 13:08