Конструктор перемещения и оператор присваивания перемещают ошибку при установке значения по умолчанию в исходном файле cc - PullRequest
0 голосов
/ 07 мая 2020

У меня есть базовый класс шаблона, который выглядит примерно так

Vector. cc:

template<typename T, unsigned int D>
class Vector {

    private:
        T _data[D];

        ...

    public:
        Vector(Vector<T, D>&&);

        ...

    public:
        Vector<T, D>& operator=(Vector<T, D>&&);;
};

extern template class Vector<int, 2>;
extern template class Vector<int, 3>;
extern template class Vector<int, 4>;

Vector.h

// include guard

#include "Vector.h"

template<typename T, unsigned int D>
Vector<T, D>::Vector(Vector<T, D>&&) = default;

template<typename T, unsigned int D>
Vector<T, D>& Vector<T, D>::operator=(Vector<T, D>&&) = default;

template class Vector<int, 2>;
template class Vector<int, 3>;
template class Vector<int, 4>;

// include guard

Когда я компилирую это я получаю ошибки error: array used as initializer и error: invalid array assignment и предупреждение note: synthesized method [...] first required here.

Когда я помещаю = default; в объявление в файле .h, я не получаю ошибок или предупреждений.

Я читал в нескольких источниках, что могу поставить = default; в определение, но для меня это не работает.

Что я делаю не так? Я что-то упускаю? Или я просто полагался на неправильные источники?

1 Ответ

1 голос
/ 07 мая 2020

Проблема в том, что ход по умолчанию недействителен. Предположительно, внутри класса компилятор не создает для него кода, поскольку он, скорее всего, не используется. Помещение его вне класса может привести к тому, что компилятор решит скомпилировать оператор / конструктор.

Подумайте об этом в основном c примере:

int array[5]; 
int array2[5]; 
array = array2;

Вышеупомянутое недопустимо в C ++, так как массивы не могут быть назначены друг другу.

В этом случае вам нужно будет создать свой собственный оператор / конструктор перемещения для вашего класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...