| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Класс для работы с дробями |
| Автор: Superklug 23.2.2010, 20:30 | ||||
| Доброго времени суток! Пишу класс для работы с дробями.. Хотелось бы добиться полной совместимости с int.
В случае если пытаюсь написать что-нибудь вроде:
Возникает ошибка: error C2666: 'operator +' : 2 overloads have similar conversions Как избежать этого? |
| Автор: Ockonal 23.2.2010, 20:41 |
| Да, я тут писал класс для работы с дробями: http://wincode.org.ua/?p=245 ---- А по вопросу конкретно: http://kbalertz.com/106392/C2666-Error-Generated-Overloaded-Operator.aspx |
| Автор: Superklug 23.2.2010, 21:16 |
| Ockonal, ваш класс не совсем то, что мне нужно... Мне бы хотелось добиться такого, что работать с моим классом вместе с int будет так же просто как и double вместе с int... На сколько я понимаю ошибка заключается в том, что компилятор не может выбрать между int+drob и int+int.. Можно конечно всегда явно указывать (int), но как-то же можно реализовать иначе? |
| Автор: bsa 24.2.2010, 12:23 |
| Superklug, operator int() лишний. От него лучше избавиться, так как из-за него будет ОЧЕНЬ много проблем. Добавлено через 1 минуту и 11 секунд Я бы вместо drob operator +=(drob x) писал бы drob& operator +=(const drob &x) - меньше лишних операций копирования. |
| Автор: Superklug 24.2.2010, 15:37 | ||
| Леопольд, спасибо! Сейчас попробую разобраться... bsa, я б с радостью избавился... Но не умею по другому. Как без него сделать работоспособным след код:
А по поводу ссылок знаю.. Просто на форуме заморачиваться не стал |
| Автор: Superklug 24.2.2010, 15:58 | ||
Леопольд, выходит надо добавлять по два шаблона для каждого оператора? Например:
И еще, если оставить ф-ю drob operator+(drob d1, drob d2), то та ошибка возникает снова. Можно операции реализовывать непосредственно в шаблонных функциях.. Я правильно мыслю? Или усложнил все) |
| Автор: bsa 24.2.2010, 16:59 |
| А не надо его делать работоспособным. Так как эта функциональность провоцирует ошибки. Более того, в библиотеке boost во всех типах, которые можно привести к bool (например, умные указатели - проверка на NULL), делают это через оператор преобразования к указателю на метод этого типа. И делают это специально, чтобы не дай бог случилось, что кто-то случайно ошибся и компилятор это молча проглотил... Я тебе уже написал про оператор преобразования. Все эти и будущие проблемы именно в нем. |
| Автор: Леопольд 24.2.2010, 17:48 | ||||||
Два не надо, в случае с a + b будет вызов drob operator+ (a, drob(b)) Я лишь показал как можно обойти проблему. Однако operator int() ещё может тебе напакостить. Можно где-нибудь легко получить двойное пользовательское преобразование, к примеру:
Но лучше просто убарть operator int(), как уже заметил bsa:
|