предупреждение: базовый класс должен быть explictily инициализируется в конструкторе копирования

Я пишу матричный класс для обработки CUDA.

Я написал векторный класс (отныне известный как Elements) и использовал это для базы матрицы.

вот определение шаблона:

template <typename T, std::size_t M, std::size_t N>
class Matrix : public Elements< Elements< T, N >, M > {

}

следует отметить, что в Elements класс, ни в Matrix класса.

Я warning: base class ‘struct Elements<Elements<double, 2ul>, 2ul>’ should be explicitly initialized in the copy constructor предупреждения в конструкторе копирования. Вот конструктор копирования:

    DEVICE HOST
    Matrix(const Matrix & that) {
        for (std::size_t ind = 0; ind < M; ind++) {
            for (std::size_t jnd = 0; jnd < N; jnd++) {
                (*this)[ind][jnd] = that[ind][jnd];
            }
        }
    }

что я делаю не так?

3 ответов


вы не инициализируете базовый класс в конструкторе копирования. Попробуйте это:

Matrix(const Matrix & that) : Elements<Elements<T, N>, M>(that) {
    /* ... */
}

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

Edit: это может быть удобно для частного

typedef Elements<Elements<T, N>, M> basetype;

в определении класса где-то.


Если вы явно определяете конструктор копирования производного класса и не вызываете в списке ctor конструктор копирования базового класса, то компилятор сам вызовет конструктор по умолчанию для базового класса. Вполне возможно, что это не то, чего вы хотели. Поэтому компилятор предупреждает вас.

У меня есть пример, который демонстрирует разницу в моем artical
" неявно определенный конструктор копирования и явно определенный конструктор копирования: что такое разница" он написан на русском языке, но вы сможете прочитать его, используя, например, сервис Google translate.


для любого производного класса, базовый класс должен быть создан при каждом производном классе. Если базовый класс не имеет конструктора по умолчанию ( 0 аргументов), необходимо указать, как его построить во всех конструкторах производного класса.

Итак, предполагая, что элементы имеют открытый конструктор копирования, вам понадобится что-то вроде :

Matrix(const Matrix & that) 
: Elements<Elements<T, N>, M>(that)
{ 
  ...
}