![]() |
|
Модераторы: bsa |
![]()
|
|
| zim22 |
|
||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
Как сделать, чтобы вызывался operator== из His_lib?
Можно его явно вызывать(закомментированная строчка в коде), но некрасиво как-то... При попытке добавить
компилятор ругается : error C2593: 'operator ==' is ambiguous
|
||||
|
|||||
| ISergeyN |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 11.10.2008 Где: Україна Репутация: 2 Всего: 2 |
А если так сделать
|
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
не жульничайте! |
|||
|
||||
| azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
zim22
Ну так тут два, абсолютно идентичных (по сигнатуре) оператора сравнения. Используя тип Date вы заставляете компилятор искать оператор и в его пространстве имен, как следствие этого Если using His_lib::operator ==; написан - он видет два оператора, если нет - видит один и вызывает его из пространства имен Chrono.
Вот так он сработает.
но это уже извращения..а можно узнать зачем это нужно? По идее вы пишите два оператора сравнения для одного и того же класса, в разных неймспейсах..и притом хотите чтобы поиск шел в обоих из них. Непонятно Еще как вариант.
Это сообщение отредактировал(а) azesmcar - 14.7.2009, 20:32 |
||||||
|
|||||||
| zim22 |
|
||||||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
а вот этого я не хотел. я хотел явно указать, чтобы вызывался His_lib::operator== Я хочу использовать существующий класс Date, но со своей, переопределённой операцией сравнения, т.к. меня не устраивает operator== из Chrono, а переписать его я не могу - компьютер взорвётся Для логической связности данных я создаю namespace His_Lib, указываю в нём, что я буду пользоваться классом Date из Chrono
хотя не совсем хорошо указываю, более правильно было бы так:
и определяю СВОЙ оператор сравнения. но он не вызывается... а вызывается
*** ваш 1 вариант не подходит: два разных класса Date создаётся 2 вариант тоже не подходит: создаётся новый класс Date 3 вариант - подходит! Это сообщение отредактировал(а) zim22 - 14.7.2009, 20:45 |
||||||||
|
|||||||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Ну, хотел не хотел а это так Поиск идет также в пространстве имен аргументов функции/оператора.
Ну да, разумеется..я просто для примера показал, чтобы причина нагляднее была. |
||||
|
|||||
| Леопольд |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
using His_lib::operator==; делает видимым этот оператор в глобальном пространстве имён. ADL находит operator== в том пространстве имён где определён класс Date, т.е. в Chrono. Следовательно, компилятор пытается разобраться какую из функций вызвать. Но, так-как они имеют абсолютно одинаковую сигнатуру, получается неоднозначность вызова. Такая перегрузка не может быть разрешена. Это сообщение отредактировал(а) Леопольд - 15.7.2009, 11:41 -------------------- вопросов больше чем ответов |
||||
|
|||||
| zim22 |
|
||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
то, что два operator== имеют одинаковую сигнатуру - не является поводом для неоднозначного вызова. компилятор в состоянии разрешить эту однозначность, если ему помочь.
если строчки "// помогаем" закомментировать - то будет ambiguos call |
||||
|
|||||
| Леопольд |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Не будет, потому что здесь нет вызова функции. Будут другие ошибки, не связанные с разрешением перегрузки. Я имел ввиду следующее.
Это сообщение отредактировал(а) Леопольд - 15.7.2009, 12:06 -------------------- вопросов больше чем ответов |
||||
|
|||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
ambiguos symbol будет я даже и не думал, что проблема в перегрузке функции. думал - конфликт namespace. спасибо. разные типы возвращаемых значений и параметров у operator== поставил - и компилятор начал находить нужные функции.
Это сообщение отредактировал(а) zim22 - 15.7.2009, 12:05 |
|||
|
||||
| azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
А причем тут возвращаемый тип? Функции по возвращаемому типу не перегружаются, перегрузка в вашем случае произошла по второму аргументу оператора ==. Возвращаемый тип функции не является частью ее сигнатуры.
там не было перегрузки, там были и компилятор не знал какой из них вызывать, потому и ambiguous (неоднозначность). Это сообщение отредактировал(а) azesmcar - 15.7.2009, 12:29 |
||||||
|
|||||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Насколько я помню, возвращаемый тип имеет значение для операторов преобразования типа, но они настолько специальные что на это можно "эакрыть глаза". -------------------- вопросов больше чем ответов |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
речь о user-defined conversions?
для них не указывается возвращаемый тип и его нелзя изменить, возвращаемый тип всегда тот, для которого оператор написан. |
||||
|
|||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Вроде бы "перегрузка" означает несколько функций с одинаковым именем, видимых в точке вызова. Если у пары (или больше) из них будет одинаковая сигнатура, то перегрузка не может быть разрешена однозначно. Т.е. здесь как раз возникла неоднозначность из-за того что "видны" две функции с одинаковым именем и одинаковой сигнатурой. Если это не перегрузка operator==, то как это ещё обозвать? Это сообщение отредактировал(а) Леопольд - 15.7.2009, 14:20 -------------------- вопросов больше чем ответов |
|||
|
||||
![]()
|
| Правила форума "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. |