我只是没有看到我的错误。关于此错误消息有很多问题,并且答案不适用或我只是看不到它们适用。也许应该改进错误信息?
Matrix a = Matrix(3, 4);
// fill a with values
Matrix c = Matrix(4, 4);
// fill c with values
a *= c - c; //this is where the compile error occurs
当我将行更改为a *= c
时,它可以正常工作。所以我猜* =运算符没什么问题。
这是Matrix * =运算符:
Matrix &Matrix::operator *=(Matrix &B)
{
Matrix M(rows(), B.cols());
for (int i = 0; i<rows(); i++)
{
for (int j=0; j<B.cols(); j++)
{
for (int k=0; k<cols(); k++)
{
M(i,j) = M(i,j) + (*this)(i,k) * B(k,j);
}
}
}
return M;
}
这是 - 操作员:
Matrix operator -(Matrix &A, Matrix &B)
{
//TODO: Check if matrices have same dimensions, exception else
Matrix M(A.rows(), A.cols());
for(int i=0; i<A.rows(); i++)
{
for(int j=0; j<A.cols(); j++)
{
M(i,j) = A(i,j)-B(i,j);
}
}
return M;
}
答案 0 :(得分:4)
通过命令c - c
,您可以通过operator-
生成一个新矩阵并将其返回。接下来,operator*=
引用矩阵,这是编译器抱怨的地方。这样做是为了防止你想要使用底层对象到期的事实。
尝试将Matrix&
更改为Matrix const&
。这将延长对象的生命周期,直到函数结束。另外,从const-correctness视图来看,它也更合适。
此外,您应该从*this
返回operator*=
并更改包含的矩阵。 (感谢@CoryKramer的指点,在匆忙回答时错过了它。)
所以你的操作员应该基本上看起来像(只是基本概念,根本没有优化):
Matrix &Matrix::operator *=(Matrix const& B)
{
Matrix M(rows(), B.cols());
for (int i = 0; i<rows(); i++)
{
for (int j=0; j<B.cols(); j++)
{
for (int k=0; k<cols(); k++)
{
M(i,j) += (*this)(i,k) * B(k,j);
}
}
}
//copy -- or better move -- the temporary matrix into *this
operator=(std::move(M));
return *this;
}
答案 1 :(得分:0)
解决方案是从
更改操作员签名Matrix operator -(Matrix &A, Matrix &B);
到
Matrix operator -(const Matrix &A, const Matrix &B)
适用于所有运营商。我还必须添加一个新的运算符const double & operator ()(int row, int column) const;
,否则语句B(k,j)
将无效。
除此之外,我做了davidhigh建议并返回* this而不是临时Matrix对象。
发生错误的声明为a *= c-c
。
首先,c-c
会创建临时对象。然后,此临时对象通过引用传递给*=
运算符。 C ++只允许将临时值传递给const引用,值或rvalue。
谢谢大家帮助我。