"Нет жизнеспособного перегруженного =" nullptr - PullRequest
0 голосов
/ 28 декабря 2018

Я только начал с 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 Ответ

0 голосов
/ 28 декабря 2018

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;
  // ...
};
...