| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Поиск имени в пространстве имён |
| Автор: zim22 14.7.2009, 19:37 | ||||
| Как сделать, чтобы вызывался operator== из His_lib? Можно его явно вызывать(закомментированная строчка в коде), но некрасиво как-то... При попытке добавить
компилятор ругается : error C2593: 'operator ==' is ambiguous
|
| Автор: ISergeyN 14.7.2009, 19:59 | ||
А если так сделать
|
| Автор: zim22 14.7.2009, 20:04 |
не жульничайте! |
| Автор: azesmcar 14.7.2009, 20:13 | ||||||
| zim22 Ну так тут два, абсолютно идентичных (по сигнатуре) оператора сравнения. Используя тип Date вы заставляете компилятор искать оператор и в его пространстве имен, как следствие этого Если using His_lib::operator ==; написан - он видет два оператора, если нет - видит один и вызывает его из пространства имен Chrono.
Вот так он сработает.
но это уже извращения..а можно узнать зачем это нужно? По идее вы пишите два оператора сравнения для одного и того же класса, в разных неймспейсах..и притом хотите чтобы поиск шел в обоих из них. Непонятно Еще как вариант.
|
| Автор: azesmcar 14.7.2009, 20:48 | ||||
Ну, хотел не хотел а это так Поиск идет также в пространстве имен аргументов функции/оператора.
Ну да, разумеется..я просто для примера показал, чтобы причина нагляднее была. |
| Автор: Леопольд 15.7.2009, 11:31 | ||||
using His_lib::operator==; делает видимым этот оператор в глобальном пространстве имён. ADL находит operator== в том пространстве имён где определён класс Date, т.е. в Chrono. Следовательно, компилятор пытается разобраться какую из функций вызвать. Но, так-как они имеют абсолютно одинаковую сигнатуру, получается неоднозначность вызова. Такая перегрузка не может быть разрешена. |
| Автор: zim22 15.7.2009, 11:42 | ||||
то, что два operator== имеют одинаковую сигнатуру - не является поводом для неоднозначного вызова. компилятор в состоянии разрешить эту однозначность, если ему помочь.
если строчки "// помогаем" закомментировать - то будет ambiguos call |
| Автор: Леопольд 15.7.2009, 11:55 | ||||
Не будет, потому что здесь нет вызова функции. Будут другие ошибки, не связанные с разрешением перегрузки. Я имел ввиду следующее.
|
| Автор: zim22 15.7.2009, 12:04 | ||
ambiguos symbol будет я даже и не думал, что проблема в перегрузке функции. думал - конфликт namespace. спасибо. разные типы возвращаемых значений и параметров у operator== поставил - и компилятор начал находить нужные функции.
|
| Автор: azesmcar 15.7.2009, 12:26 | ||||||
А причем тут возвращаемый тип? Функции по возвращаемому типу не перегружаются, перегрузка в вашем случае произошла по второму аргументу оператора ==. Возвращаемый тип функции не является частью ее сигнатуры.
там не было перегрузки, там были и компилятор не знал какой из них вызывать, потому и ambiguous (неоднозначность). |
| Автор: Леопольд 15.7.2009, 12:33 | ||
Насколько я помню, возвращаемый тип имеет значение для операторов преобразования типа, но они настолько специальные что на это можно "эакрыть глаза". |
| Автор: azesmcar 15.7.2009, 12:43 | ||||
речь о user-defined conversions?
для них не указывается возвращаемый тип и его нелзя изменить, возвращаемый тип всегда тот, для которого оператор написан. |
| Автор: zim22 15.7.2009, 13:21 | ||
да, точно. туплю что-то... |
| Автор: Леопольд 15.7.2009, 14:17 | ||
Вроде бы "перегрузка" означает несколько функций с одинаковым именем, видимых в точке вызова. Если у пары (или больше) из них будет одинаковая сигнатура, то перегрузка не может быть разрешена однозначно. Т.е. здесь как раз возникла неоднозначность из-за того что "видны" две функции с одинаковым именем и одинаковой сигнатурой. Если это не перегрузка operator==, то как это ещё обозвать? |
| Автор: azesmcar 15.7.2009, 14:27 | ||||||
Ну, называться то она называется
только вот в правильно составленной программе такой перегрузки быть не может
|
| Автор: Леопольд 15.7.2009, 14:33 | ||||||
Просто хотелось внести ясность и назвать вещи своими именами. Добавлено @ 14:36
Честно говоря, не понял о чём речь. Может, потому что цитата не имеет контекста? |
| Автор: azesmcar 15.7.2009, 14:39 | ||
Перевод: Не всякие декларации функций могут быть перегружены. почему же нет? вот контекст
|
| Автор: Леопольд 15.7.2009, 14:42 | ||
Погуглил и понял о чём речь http://www.kuzbass.ru/docs/isocpp/over.html Есть ограничения на перегрузку. Но это, вроде, не "наш" случай. |
| Автор: azesmcar 15.7.2009, 14:59 | ||
| Леопольд Перегрузка функции осуществляется "по чему-то". По количеству аргументов, по типу аргументов, итд... Если две функции абсолютно идентичны - это называется redefinition, такой перегрузки быть не может по идее. Добавлено через 2 минуты Вот, покопался. Для примера, как это называет стандарт
|
| Автор: Леопольд 15.7.2009, 15:20 | ||
Если взглянуть с этой стороны, то это нарушение ODR. Так, наверное, действительно будет правильнее. На всякий случай добавлю что из ODR тоже есть исключения. Например, inline, функции... |