2013-03-20 3 views
0

У меня есть класс, который выполняет десятичные вычисления. У меня все математические операторы перегружены. Он отлично работает для довольно простых вычислений, но не удается, когда мне нужно добавить parens. Например, оба вычисления в следующей работе и получить правильный результат:Ошибка совпадения для 'operator *'

myClass r, a = 100000, b = 2.5, c = 10, d = 30; 
r = c/d * a * b; 
r = (c/d) * a * b; 

, но если я изменить расчет, чтобы r = a * b * (c/d); компиляция завершается с:

error: no match for ‘operator*’ in ‘myClass::operator*(myClass&)((* & b)) * myClass::operator/(myClass&)((* & d))’ in gcc 4.6.2. 

Я, вероятно, не хватает что-то простое, но не может его найти. Что я делаю не так?

+7

Мы упускаем что-то простое: Код с операторами. –

+2

Я смотрю в свой хрустальный шар, и я вижу: ваш 'operator *' или 'operator /' либо не является 'const', либо ему не хватает аргумента' const'. (обратите внимание: это совершенно дикая догадка, и нам действительно нужны подписи ваших операторов, чтобы иметь возможность делать что-либо помимо диких догадок). – Yakk

+0

Вы убедились, что ваш 'operator /' возвращает ссылку 'const ' результат? – Porkbutts

ответ

2

Как предполагалось почти всем, проблемы не хватало const отборочные. Также фактором было то, что копия возвращалась вместо ссылки.

Недопустимый код в вопросе было так:

myClass operator *= (myClass &num) { return Mul(num); } 
myClass operator * (myClass &num) { return Mul(num); } 

Исправленная версия:

myClass& operator *= (const myClass &num) { Mul(num); return *this; } 
friend myClass operator * (const myClass &num1, const myClass &num2) { myClass tmp(num1) tmp.Mul(num2); return tmp; } 
Смежные вопросы