Как инициализировать члены базового класса шаблона из списка инициализатора производного конструктора? - PullRequest
0 голосов
/ 03 октября 2018

Это:

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 голосов
/ 03 октября 2018

Вам необходимо инициализировать базовый класс в списке инициализации членов производного класса.Поскольку ваша база не имеет конструктора, вы можете использовать фигурную инициализацию (равномерную инициализацию), например

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

template <typename T>
struct derived : base<T> {
    derived(T v) : base<T>{v} {}
};
0 голосов
/ 03 октября 2018

Создайте конструктор в базовом классе и вызовите его в списке инициализации производного класса.т.е.:

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

template <typename T>
struct derived : base<T> {
    derived(T v) : base(v) {}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...