我有一个矩阵类,其中包含一组函数
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 ++编译器。
答案 0 :(得分:3)
您没有在帖子中包含add
的代码,但我可以从错误中看到它有签名void Matrix::add(Matrix& m)
。这里Matrix&
表示您传递的对象必须是l-value。粗略地说,如果一个对象有一个名字,那么它就是l值,而一个临时变量则没有。
您必须更改add
功能的签名:它必须是add(Matrix a)
或add(const Matrix& a)
。在第一种情况下,该函数接收对象的副本。在第二种情况下,它接收一个常量引用,临时值可以绑定到常量引用。后者是首选,因为没有不必要的副本。
如果您没有打算在函数中修改它们,则不要通过引用传递参数(没有const
)。喜欢const Type&
。