“没有可行的重载=” nullptr

时间:2018-12-28 19:59:17

标签: c++ matrix rvalue-reference move-constructor nullptr

我刚开始使用C ++,并被困在move构造函数上。这是我的.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 :(得分:3)

data_是向量非指针对象 ,而nullptr则将 pointer 初始化为空指针。

您不能将非指针变量分配为空指针。而且C ++没有任何null值或对象的概念。

如果要正确初始化向量,建议您添加一个构造函数初始化器列表:

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

或者,您可以依靠the rule of zero并让编译器生成的构造函数为您处理所有事情,在这种情况下,它应该可以正常运行:

class SimpleMatrix {
 public:
  SimpleMatrix(SimpleMatrix &&) = default;
  // ...
};