Перегрузка оператора C ++ в выражении - PullRequest
4 голосов
/ 16 июня 2011

Я уверен, что где-то уже отвечали, но я не знаю, что искать.

У меня следующая ситуация. Я создал класс Vector и перегрузил операторы «*» (умножить на escalar) и «+» (добавьте два вектора). Теперь следующая строка кода:

Vector sum = (e_x*u_c) + (e_y*u_r);

Это дает мне следующую ошибку:

error: no match for 'operator+' in '((Teste*)this)->Teste::e_x.Vector::operator*(u_c) + ((Teste*)this)->Teste::e_y.Vector::operator*(u_r)'

Но, если я заменю эту строку ошибки на:

Vector aux = (e_x*u_c);
Vector aux2 = (e_y*u_r);
Vector sum = aux + aux2;

Я не получаю ошибок вообще. Зачем? Разве эти два выражения не должны быть эквивалентными?

EDIT: Вот мои определения "*" и "+":]

Vector Vector::operator+(Vector& right)
{
    return Vector(x + right.x, y + right.y, z + right.z);
}
double Vector::operator*(Vector& right)
{
    return this->scalar_product(right);
}

Ответы [ 2 ]

10 голосов
/ 17 июня 2011

Заменить Vector& right на const Vector& right.

Выражение (e_x*u_c) является rvalue, и ссылки на неконстантные не будут привязываться к rvalue.

Кроме того, сами функции-члены также должны быть помечены const:

Vector Vector::operator+(const Vector& right) const
{
    return Vector(x + right.x, y + right.y, z + right.z);
}

double Vector::operator*(const Vector& right) const
{
    return this->scalar_product(right);
}

scalar_product также должен быть отмечен const. Подробнее о правильности констант здесь .

1 голос
/ 17 июня 2011

Заявления не верны.

T T::operator +(const T& b) const;​

T T::operator *(const T& b) const;

Операторы на C и C ++

...