![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Superklug |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
Доброго времени суток!
Пишу класс для работы с дробями.. Хотелось бы добиться полной совместимости с int.
В случае если пытаюсь написать что-нибудь вроде:
Возникает ошибка: error C2666: 'operator +' : 2 overloads have similar conversions Как избежать этого? |
||||
|
|||||
Ockonal |
|
|||
![]() Smile ![]() Профиль Группа: Участник Сообщений: 219 Регистрация: 9.7.2007 Где: Ukraine::Nikolaev ; Репутация: нет Всего: 3 |
Да, я тут писал класс для работы с дробями: http://wincode.org.ua/?p=245
---- А по вопросу конкретно: http://kbalertz.com/106392/C2666-Error-Gen...d-Operator.aspx Это сообщение отредактировал(а) Ockonal - 23.2.2010, 20:45 --------------------
Ум заключается не только в знании, но и в умении прилагать знание на деле.Самое лучшее из всех доказательств есть опыт.Каждому человеку свойственно ошибаться, но никому, кроме глупца, несвойственно упорствовать в ошибке. |
|||
|
||||
Superklug |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
Ockonal, ваш класс не совсем то, что мне нужно...
Мне бы хотелось добиться такого, что работать с моим классом вместе с int будет так же просто как и double вместе с int... На сколько я понимаю ошибка заключается в том, что компилятор не может выбрать между int+drob и int+int.. Можно конечно всегда явно указывать (int), но как-то же можно реализовать иначе? Это сообщение отредактировал(а) Superklug - 23.2.2010, 21:17 |
|||
|
||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Добавь
Добавлено через 9 минут и 9 секунд Так и есть. Компилятор перед выбором. operator+(drob(b), a) или b + a.operator int() Добавлено через 11 минут и 25 секунд Оба выражения включают в себя по одному пользовательскому преобразованию и поэтому равнозначны. Функция, где не будет таких неявных преобразований будет препочтительнее тем двум. Это сообщение отредактировал(а) Леопольд - 24.2.2010, 09:18 -------------------- вопросов больше чем ответов |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Superklug, operator int() лишний. От него лучше избавиться, так как из-за него будет ОЧЕНЬ много проблем.
Добавлено через 1 минуту и 11 секунд Я бы вместо drob operator +=(drob x) писал бы drob& operator +=(const drob &x) - меньше лишних операций копирования. |
|||
|
||||
Superklug |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
Леопольд, спасибо! Сейчас попробую разобраться...
bsa, я б с радостью избавился... Но не умею по другому. Как без него сделать работоспособным след код:
А по поводу ссылок знаю.. Просто на форуме заморачиваться не стал ![]() |
|||
|
||||
Superklug |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
Леопольд, выходит надо добавлять по два шаблона для каждого оператора? Например:
И еще, если оставить ф-ю drob operator+(drob d1, drob d2), то та ошибка возникает снова. Можно операции реализовывать непосредственно в шаблонных функциях.. Я правильно мыслю? Или усложнил все) |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
А не надо его делать работоспособным. Так как эта функциональность провоцирует ошибки.
Более того, в библиотеке boost во всех типах, которые можно привести к bool (например, умные указатели - проверка на NULL), делают это через оператор преобразования к указателю на метод этого типа. И делают это специально, чтобы не дай бог случилось, что кто-то случайно ошибся и компилятор это молча проглотил... Я тебе уже написал про оператор преобразования. Все эти и будущие проблемы именно в нем. |
|||
|
||||
Леопольд |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Два не надо, в случае с a + b будет вызов drob operator+ (a, drob(b)) Я лишь показал как можно обойти проблему. Однако operator int() ещё может тебе напакостить. Можно где-нибудь легко получить двойное пользовательское преобразование, к примеру:
Но лучше просто убарть operator int(), как уже заметил bsa:
Это сообщение отредактировал(а) Леопольд - 25.2.2010, 09:53 -------------------- вопросов больше чем ответов |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |