Почему визуал студия ругается на то, что не найден нужный оператор, хотя для него есть нужная перегрузка

Я написал структуру, которая создаёт матрицу с помощью двухмерного динамического массива и написал перегрузку для операторов + ,- ,* , =, <<, но почему-то при их использовании выдаёт ошибку, мол отсутствует оператор, соответствующий этим операндам.

Matrix Matrix::operator*(Matrix& a)
{
    Matrix result(this->rows, a.columns);
    for (unsigned i{}; i < this->rows; i++)
    {
        for (unsigned j{}; j < a.columns; j++)
        {
            for (unsigned z{}; z < this->columns; z++)
            {
                result[i][z] += *this[i][j] * a[j][z];
            }
        }
    }
    return result;
}

Matrix& Matrix::operator=(Matrix& a)
{
    for (unsigned i{}; i < rows; i++)
    {
        for (unsigned j{}; j < columns; j++)
        {
            matrix[i][j] = a[i][j];
        }
    }
    return *this;
}

std::ostream& operator<<(std::ostream& stream, Matrix& matx)
{
    std::string result;
    for (unsigned i{}; i < matx.rows; i++)
    {
        result += '\n';
        for (unsigned j{}; j < matx.columns; j++)
        {
            result += std::to_string(matx.matrix[i][j]) + '\t';
        }
    }
    return stream << result;
}

int main()
{
    Matrix A(2, 2);
    Matrix B(2, 3);
    Matrix C(2, 2);

    C = A * B;   // выдаёт ошибку о ненайденном операторе
    cout << A * B << endl;   // выдаёт ошибку о ненайденном операторе
    C = A;   // всё работает хорошо
    cout << C << endl;   // всё работает хорошо
}

С чем это может быть связано?


Ответы (1 шт):

Автор решения: Harry

Смотрим на

Matrix& Matrix::operator=(Matrix& a)

Где вы видите справа, в C = A*B lvalue? Там у вас возвращается вовсе даже не ссылка:

Matrix Matrix::operator*(Matrix& a)

Так что надо оператору присваивания передавать

Matrix& Matrix::operator=(const Matrix& a)

Или вы в будущем планируете его изменить, и изменять не только то, чему присваиваете, но и то, что присваиваете, и потому такая сигнатура?

→ Ссылка