C++ Унаследованные классы шаблонов и списки инициализации

Я преобразовывал некоторые из своих математических классов в шаблоны и использовал списки инициализации, и столкнулся с проблемой, когда унаследованному классу необходимо получить доступ к элементам данных базового класса при инициализации.

Вот код:

template <typename T>
struct xCoord2
{
    T x;
    T y;

    xCoord2(T _x, T _y) : x(_x), y(_y) {};
};

template <typename T>
struct xCoord3 : xCoord2<T>
{
    typedef xCoord2<T> B;

    T z;

    // All Error
    xCoord3(T _x, T _y, T _z) : x(_x), y(_y), z(_z) {};
    xCoord3(T _x, T _y, T _z) : B::x(_x), B::y(_y), z(_z) {};
    xCoord3(T _x, T _y, T _z) : this->x(_x), this->y(_y), z(_z) {};

    // Works
    xCoord3(T _x, T _y, T _z) { B::x = 0; B::y = 0; z = 0; };
};

Можно ли использовать списки инициализации для унаследованных классов?


person Shawn Buckley    schedule 27.01.2011    source источник
comment
Действительно ли xCoord3 является xCoord2? Или они просто разделяют определенные элементы данных? Это тот случай, когда наследование не может быть хорошей идеей, если между двумя классами нет отношения «есть».   -  person James McNellis    schedule 27.01.2011
comment
Пример является лишь частью каждого класса, но наследование здесь очень полезно, так как оно позволяет выполнять математические операции между двумя типами.   -  person Shawn Buckley    schedule 27.01.2011


Ответы (1)


Вам нужно вызвать конструктор базового класса:

xCoord3(T _x, T _y, T _z) : xCoord2(_x, _y), z(_z) { } 

Это не изменилось бы, если бы это были классы, не являющиеся шаблонами: вы можете только инициализировать базовые классы и переменные-члены производного класса в конструкторе производного класса.

person James McNellis    schedule 27.01.2011