gpt4 book ai didi

c++ - 从类型 'Matrix&' 的右值初始化类型 'Matrix' 的非常量引用无效

转载 作者:行者123 更新时间:2023-11-30 01:40:26 26 4
gpt4 key购买 nike

我只是没有看到我的错误。关于此错误消息的问题太多了,答案要么不适用,要么我只是看不到它们适用。也许应该改进错误消息?

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

最佳答案

通过命令c - c,您可以通过operator- 生成一个新矩阵并将其返回。接下来,operator*= 引用了一个矩阵,这是编译器报错的地方。它这样做是为了防止您发现底层对象将在您想要使用它时过期。

尝试将 Matrix& 更改为 Matrix const&。这将延长对象的生命周期,直到函数结束。另外,从 const-correctness 的角度来看,它也更合适。

此外,您应该从 operator*= 返回 *this 并更改包含的矩阵。 (感谢@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;
}

关于c++ - 从类型 'Matrix&' 的右值初始化类型 'Matrix' 的非常量引用无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43377117/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com