如何从派生的构造方法初始化列表初始化模板基类的成员?

时间:2018-10-03 16:36:47

标签: c++ c++11

此:

template <typename T>
struct base {
    T a;
};

template <typename T>
struct derived : base<T> {
    derived(T v) : a(v) {} // xxx: how?
};

int main() {
    return 0;
}

蓬勃发展:

test.cc: In constructor ‘derived<T>::derived(T)’:
test.cc:12:20: error: class ‘derived<T>’ does not have any field named ‘a’
     derived(T v) : a(v) {} // xxx: how?

如果我将a(v)替换为{ this->a = v; }很好,是否有任何方法可以从派生类的初始化列表中初始化模板化基类的成员?

2 个答案:

答案 0 :(得分:4)

您需要在派生类的成员初始化列表中初始化基类。由于您的库没有构造函数,因此可以使用花括号初始化(统一初始化),例如

import-osmborder

答案 1 :(得分:2)

在基类中创建一个构造函数,并在派生类的初始化列表中调用它。即:

template <typename T>
struct base {
    T a;
    base(T v) : a(v) { }
};

template <typename T>
struct derived : base<T> {
    derived(T v) : base(v) {}
};