这是我编写的一个简化的矩阵加法运算符重载,但是当我尝试像这样使用它时,我的 IDE (Clion) 无法识别它:m1 = m2 + m3
,并说:“二元运算符 + 不能应用于 'Matrix' 和 'Matrix' 类型的表达式”
Matrix& Matrix::operator += (Matrix& m1)
{
for (int i = 0; i < m_rows; ++i)
for (int j = 0; j < m_cols; ++j)
m_matrix[i][j] += m1.m_matrix[i][j];
return *this;
}
Matrix& operator + (Matrix m1, Matrix& m2){ return m1+=m2; }
我必须在这里修复什么?
附言我还定义了自定义复制和移动构造函数和赋值运算符:
Matrix::Matrix(const Matrix& m1)
: m_matrix{new double*[m1.rows()]},
m_rows{m1.rows()},
m_cols{m1.cols()}
{
for (int i = 0; i < m1.rows(); ++i) {
m_matrix[i] = new double[m1.cols()];
for (int j = 0; j < m1.cols(); ++j)
m_matrix[i][j] = m1.m_matrix[i][j];
}
}
Matrix& Matrix::operator = (const Matrix& m1){
Matrix matrix(m1.rows(), m1.cols());
for (int i = 0; i < m1.rows(); ++i)
for (int j = 0; j < m1.cols(); ++j)
matrix.m_matrix[i][j] = m1.m_matrix[i][j];
for (int i = 0; i < m_rows; ++i)
delete m_matrix[i];
delete m_matrix;
m_matrix = matrix.m_matrix;
m_rows = m1.rows();
m_cols = m1.cols();
return *this;
}
Matrix::Matrix(Matrix&& m1) noexcept
: m_matrix{m1.m_matrix},
m_rows{m1.m_rows},
m_cols{m1.m_cols}
{
for (int i = 0; i < m1.m_rows; ++i)
delete m1.m_matrix[i];
delete m1.m_matrix;
m1.m_rows = m1.m_cols = 0;
}
最佳答案
只是猜测,因为您没有提供头文件...会不会是您忘记在头文件中声明 operator+?
class Matrix
{
// ...
};
Matrix operator+ (Matrix m1, Matrix const& m2); // just declared, not implemented!
如果是这样,您只能在 Matrix 实现文件中使用运算符(并且只能在实现之后),因为它在其他地方根本不知道...
也看看我的更改:真的很重要,我不再返回引用;这样做会返回 m1(operator += 的结果作为引用),它是一个局部变量,因此您一使用它就会得到一个悬空引用和未定义的行为!
此外,您不会更改 m2,因此您可以轻松地将其作为 const 引用传递(前提是您对类 Matrix 中的 operator+= 进行了相同的更改),这为您提供了更大的灵 active 。
关于c++ - 为矩阵 C++ 重载 "+"运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49172367/