"Нет жизнеспособного перегруженного =" nullptr
Я только начал с C++ и застрял в конструкторе перемещения. Вот мой .cpp
:
SimpleMatrix::SimpleMatrix(SimpleMatrix &&other_mat) {
cols = other_mat.cols;
rows = other_mat.rows;
data_ = other_mat.data_;
other_mat.cols = 0;
other_mat.rows = 0;
other_mat.data_ = nullptr; // <- Error here
}
я получил No viable overloaded =
ошибка в other_mat.data_ = nullptr
, Что пошло не так? Это способ, которым я инициализирую матрицу?
Вот соответствующие части в .hpp
файл:
class SimpleMatrix {
public:
SimpleMatrix(std::size_t nrows, std::size_t ncols);
SimpleMatrix(std::initializer_list<std::initializer_list<double>> data);
SimpleMatrix(SimpleMatrix&& other_mat);
SimpleMatrix& operator=(SimpleMatrix&& other_mat);
private:
std::vector<std::vector<double> > data_;
int rows, cols;
};
1 ответ
data_
является векторным не указательным объектом, и nullptr
это инициализировать указатель, чтобы быть нулевым указателем.
Вы не можете назначить переменные без указателей как нулевые указатели. А в C++ нет понятия нулевых значений или объектов.
Если вы хотите, чтобы вектор был правильно инициализирован, я предлагаю вам добавить список инициализатора конструктора:
SimpleMatrix::SimpleMatrix(SimpleMatrix &&other_mat)
: data_(std::move(other_mat.data_)) // Move the data from the other vector
, rows(other_mat.rows)
, cols(other_mat.cols)
{
// Clear the other matrix rows and cols
other_mat.rows = 0;
other_mat.cols = 0;
}
Или вы можете положиться на правило нуля и позволить сгенерированным компилятором конструкторам обрабатывать все за вас, что в этом случае должно происходить правильно:
class SimpleMatrix {
public:
SimpleMatrix(SimpleMatrix &&) = default;
// ...
};