从'Matrix'类型的右值初始化'Matrix&'类型的非const引用

时间:2017-10-27 18:51:01

标签: c++ matrix g++

我有一个矩阵类,其中包含一组函数 Matrix operator++();

构造函数:

Matrix(int num_rows,int num_col,int initialization,double initializationValue)
{
this->num_rows=num_rows;
this->num_col=num_col;
if((num_rows*num_col)==0){values=NULL;return;}
values = new double*[num_rows];
for(int index_row=0;index_row<num_rows;index_row++)
{
    values[index_row]=new double[num_col];
    for(int index_col=0;index_col<num_col;index_col++)
    {
        switch(initialization)
        {
            case MI_ZEROS: values[index_row][index_col] =0; break;
            case MI_ONES: values[index_row][index_col]=1;break;
            case MI_EYE: values[index_row][index_col]=(index_row==index_col)? 1:0;break; //I matrix
            case MI_RAND: values[index_row][index_col]=(rand()%1000000)/1000000.0;break;
            case MI_VALUE: values[index_row][index_col]=initializationValue;break;
        }
    }

  }
}  

添加功能:

void Matrix::add(Matrix& m)
{
if(num_rows!=m.num_rows||num_col!=m.num_col)
  throw("Invalid Matrix dimensions for add operation");

 for(int iR=0; iR<num_rows; iR++ )
  for(int iC=0; iC<num_col; iC++)
    values[iR][iC] += m.values[iR][iC];
}

当我尝试这样定义时:

Matrix Matrix::operator++()
{
const double d = 1.0;
add(Matrix(num_rows, num_col, MI_VALUE, d));
return  *this;
}

我收到此错误:

  

matrix.cpp:367:45:错误:从'Matrix'类型的右值开始无效初始化'Matrix&amp;'类型的非const引用

     

add(Matrix(num_rows,num_col,MI_VALUE,d));

     

注意:初始化'void Matrix :: add(Matrix&amp;)'的参数1    void Matrix :: add(Matrix&amp; m)

我真的不明白为什么我会得到这个以及如何修复它,因为它在许多不同的功能中发生了很多,我该如何解决这个问题?

注意:我使用的是ubuntu 16.04和g ++编译器。

1 个答案:

答案 0 :(得分:3)

您没有在帖子中包含add的代码,但我可以从错误中看到它有签名void Matrix::add(Matrix& m)。这里Matrix&表示您传递的对象必须是l-value。粗略地说,如果一个对象有一个名字,那么它就是l值,而一个临时变量则没有。

您必须更改add功能的签名:它必须是add(Matrix a)add(const Matrix& a)。在第一种情况下,该函数接收对象的副本。在第二种情况下,它接收一个常量引用,临时值可以绑定到常量引用。后者是首选,因为没有不必要的副本。

如果您没有打算在函数中修改它们,则不要通过引用传递参数(没有const)。喜欢const Type&