“Matrix&”类型的非const引用的无效初始化来自'Matrix'类型的右值

时间:2017-04-12 18:33:29

标签: c++ c++11 matrix operator-overloading

我只是没有看到我的错误。关于此错误消息有很多问题,并且答案不适用或我只是看不到它们适用。也许应该改进错误信息?

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

2 个答案:

答案 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。

谢谢大家帮助我。