0

我编写了一个模板基类,如下所示:

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
4

1 回答 1

2

您可以在构造函数主体中使用,在基类初始化期间这是不可用的,您只需使用基类名称来初始化它,就像您在更改的代码片段中所做的那样。派生类的构造函数应如下所示:

template<typename T>
Derived<T>::Derived(T x) : Base<T>(x) {}
于 2021-05-20T11:12:13.483 回答