Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск имени в пространстве имён, как вызвать свой оператор? 
V
    Опции темы
zim22
Дата 14.7.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Как сделать, чтобы вызывался operator== из His_lib?
Можно его явно вызывать(закомментированная строчка в коде), но некрасиво как-то...
При попытке добавить 
Код

using His_lib::operator==;
d == 5;

компилятор ругается : error C2593: 'operator ==' is ambiguous
Код

namespace Chrono {
  class Date { };
  bool operator==(const Date&, int) { return true; }
}

namespace His_lib {
  using namespace Chrono;
  bool operator==(const Date&, int) { return false; }
}


int main()
{  
  His_lib::Date d;
  d == 5; // call Chrono::operator==
  // His_lib::operator==(d, 5);
  return 0;
}



--------------------
PM MAIL   Вверх
ISergeyN
Дата 14.7.2009, 19:59 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 11.10.2008
Где: Україна

Репутация: 2
Всего: 2



А если так сделать
Код

#include <iostream>

class Date { };

namespace Chrono {
    bool operator==(const Date&, int) { return true; }
}

namespace His_lib {
    bool operator==(const Date&, int) { return false; }
}

using His_lib::operator ==;
//using Chrono::operator ==;
int main()
{  
    Date d;

    if(d == 5) 
        std::cout << "namespace Chrono\n";
    else
        std::cout << "namespace His_lib\n";

    return 0;
}

PM MAIL Skype   Вверх
zim22
Дата 14.7.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(ISergeyN @  14.7.2009,  19:59 Найти цитируемый пост)
А если так сделать

не жульничайте!  smile  всё, что находится внутри namespaces - священно! структуру нельзя менять  smile 



--------------------
PM MAIL   Вверх
azesmcar
Дата 14.7.2009, 20:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



zim22

Ну так тут два, абсолютно идентичных (по сигнатуре) оператора сравнения. Используя тип Date вы заставляете компилятор искать оператор и в его пространстве имен, как следствие этого
Если
using His_lib::operator ==; написан - он видет два оператора, если нет - видит один и вызывает его из пространства имен Chrono.
Код

namespace Chrono {
    class Date { };
    bool operator==(const Date&, int) { return true; }
}
namespace His_lib {
    class Date {} ;
    bool operator==(const Date&, int) { return false; }
}

Вот так он сработает.
Код

namespace Chrono {
    class Date { };
    bool operator==(const Date&, int) { return true; }
}
namespace His_lib {
    class Date : Chrono::Date {} ;
    bool operator==(const Date&, int) { return false; }
}

но это уже извращения..а можно узнать зачем это нужно? По идее вы пишите два оператора сравнения для одного и того же класса, в разных неймспейсах..и притом хотите чтобы поиск шел в обоих из них. Непонятно smile 

Еще как вариант.
Код

namespace Chrono {
    class Date { };
    namespace {
        bool operator==(const Date&, int) { return true; }
    }
}
namespace His_lib {
    typedef Chrono::Date Date;
    namespace {
        bool operator==(const Date&, int) { return false; }
    }
}

using His_lib::operator ==;
//using Chrono::operator ==;


Это сообщение отредактировал(а) azesmcar - 14.7.2009, 20:32
PM   Вверх
zim22
Дата 14.7.2009, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(azesmcar @  14.7.2009,  20:13 Найти цитируемый пост)
? По идее вы пишите два оператора сравнения для одного и того же класса, в разных неймспейсах..

 smile 
Цитата(azesmcar @  14.7.2009,  20:13 Найти цитируемый пост)
и притом хотите чтобы поиск шел в обоих из них

а вот этого я не хотел. я хотел явно указать, чтобы вызывался His_lib::operator==

Цитата(azesmcar @  14.7.2009,  20:13 Найти цитируемый пост)
.а можно узнать зачем это нужно?

Я хочу использовать существующий класс Date, но со своей, переопределённой операцией сравнения, т.к. меня не устраивает operator== из Chrono, а переписать его я не могу -   компьютер взорвётся smile

Для логической связности данных я создаю namespace His_Lib, указываю в нём, что я буду пользоваться классом Date из Chrono
Код

using namespace Chrono;

хотя не совсем хорошо указываю, более правильно было бы так:
Код

namespace His_lib {
  using Chrono::Date;
  bool operator==(const Date&, int) { return false; }
}

и определяю СВОЙ оператор сравнения. но он не вызывается...  smile 
а вызывается 
Код

d == 5; // call Chrono::operator== 

***
ваш 1 вариант не подходит: два разных класса Date создаётся
2 вариант тоже не подходит: создаётся новый класс Date
3 вариант - подходит!  smile но он неочевидный какой-то. использовать анонимное пространство имён, чтобы ограничить область видимости оператора... хотя может это и нормально...

Это сообщение отредактировал(а) zim22 - 14.7.2009, 20:45


--------------------
PM MAIL   Вверх
azesmcar
Дата 14.7.2009, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(zim22 @  14.7.2009,  20:44 Найти цитируемый пост)
а вот этого я не хотел. я хотел явно указать, чтобы вызывался His_lib::operator==

Ну, хотел не хотел а это так smile 
Поиск идет также в пространстве имен аргументов функции/оператора. 

Цитата(zim22 @  14.7.2009,  20:44 Найти цитируемый пост)
ваш 1 вариант не подходит: два разных класса Date создаётся
2 вариант тоже не подходит: создаётся новый класс Date

Ну да, разумеется..я просто для примера показал, чтобы причина нагляднее была.

PM   Вверх
Леопольд
Дата 15.7.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(zim22 @ 14.7.2009,  19:37)
Как сделать, чтобы вызывался operator== из His_lib?
Можно его явно вызывать(закомментированная строчка в коде), но некрасиво как-то...
При попытке добавить 
Код

using His_lib::operator==;
d == 5;

компилятор ругается : error C2593: 'operator ==' is ambiguous

using His_lib::operator==; делает видимым этот оператор в глобальном пространстве имён. ADL находит operator== в том пространстве имён где определён класс Date, т.е. в Chrono. Следовательно, компилятор пытается разобраться какую из функций вызвать. Но, так-как они имеют абсолютно одинаковую сигнатуру, получается неоднозначность вызова. Такая перегрузка не может быть разрешена.

Это сообщение отредактировал(а) Леопольд - 15.7.2009, 11:41


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
zim22
Дата 15.7.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Леопольд @  15.7.2009,  11:31 Найти цитируемый пост)
Но, так-как они имеют абсолютно одинаковую сигнатуру, получается неоднозначность вызова. Такая перегрузка не может быть разрешена

то, что два operator== имеют одинаковую сигнатуру - не является поводом для неоднозначного вызова.
компилятор в состоянии разрешить эту однозначность, если ему помочь.
Код

namespace First {
  class Date { };
  int value;
};

namespace Second {
  class Date { };
  int value;
};

namespace Mine {
  using namespace First;
  using namespace Second;

  using First::Date;   // помогаем
  using Second::value; // помогаем
}

int main() {
  Mine::Date d1;     
  Mine::value = 15;
}

если строчки "// помогаем" закомментировать - то будет ambiguos call



--------------------
PM MAIL   Вверх
Леопольд
Дата 15.7.2009, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(zim22 @ 15.7.2009,  11:42)
если строчки "// помогаем" закомментировать - то будет ambiguos call

Не будет, потому что здесь нет вызова функции. Будут другие ошибки, не связанные с разрешением перегрузки.

Я имел ввиду следующее.
Код

namespace First {
    class Class {};
    void func(Class const&) {
        std::cout<<"First::func(Class const&)"<<std::endl;
    }
};

void func(First::Class const&){
    std::cout<<"::func(Class const&)"<<std::endl;
}

int main() {
//  using First::func; без этого будет неоднозначность вызова.
    First::Class c;
    func(c);
}


Это сообщение отредактировал(а) Леопольд - 15.7.2009, 12:06


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
zim22
Дата 15.7.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Леопольд @  15.7.2009,  11:55 Найти цитируемый пост)
 Будут другие ошибки, не связанные с разрешением перегрузки.

ambiguos symbol будет smile
я даже и не думал, что проблема в перегрузке функции. думал - конфликт namespace. спасибо.
разные типы возвращаемых значений и параметров у operator== поставил - и компилятор начал находить нужные функции.
Код

#include <string>

namespace Chrono {
  class Date { };
  bool operator==(const Date&, int) { return true; }
}

namespace His_lib {
  using Chrono::Date;
  int operator==(const Date&, std::string&) { return 5; }
}

int main()
{  
  His_lib::Date d;  
  using His_lib::operator==;
  d == std::string("hi");    
}



Это сообщение отредактировал(а) zim22 - 15.7.2009, 12:05


--------------------
PM MAIL   Вверх
azesmcar
Дата 15.7.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(zim22 @  15.7.2009,  12:04 Найти цитируемый пост)
разные типы возвращаемых значений и параметров у operator== поставил - и компилятор начал находить нужные функции.

А причем тут возвращаемый тип? Функции по возвращаемому типу не перегружаются, перегрузка в вашем случае произошла по второму аргументу оператора ==. Возвращаемый тип функции не является частью ее сигнатуры.
Цитата

Function signatures do not include return type, because that does not participate in overload resolution.


Цитата(zim22 @  15.7.2009,  12:04 Найти цитируемый пост)
я даже и не думал, что проблема в перегрузке функции. думал - конфликт namespace. спасибо.

там не было перегрузки, там были

Цитата(azesmcar @  14.7.2009,  20:13 Найти цитируемый пост)
два, абсолютно идентичных (по сигнатуре) оператора сравнения

и компилятор не знал какой из них вызывать, потому и ambiguous (неоднозначность). 

Это сообщение отредактировал(а) azesmcar - 15.7.2009, 12:29
PM   Вверх
Леопольд
Дата 15.7.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(azesmcar @ 15.7.2009,  12:26)
А причем тут возвращаемый тип? Функции по возвращаемому типу не перегружаются, перегрузка в вашем случае произошла по второму аргументу оператора ==. Возвращаемый тип функции не является частью ее сигнатуры.

Насколько я помню, возвращаемый тип имеет значение для операторов преобразования типа, но они настолько специальные что на это можно "эакрыть глаза".


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 15.7.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Леопольд @  15.7.2009,  12:33 Найти цитируемый пост)

Насколько я помню, возвращаемый тип имеет значение для операторов преобразования типа, но они настолько специальные что на это можно "эакрыть глаза". 

речь о user-defined conversions?
Код

class A
{
private:
    int i_;
public:
    A(int i): i_(i) {}
    operator int() const {
        return i_;
    }
};

для них не указывается возвращаемый тип и его нелзя изменить, возвращаемый тип всегда тот, для которого оператор написан.

PM   Вверх
zim22
Дата 15.7.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(azesmcar @  15.7.2009,  12:26 Найти цитируемый пост)
там не было перегрузки, там были два, абсолютно идентичных (по сигнатуре) оператора сравнения

да, точно. туплю что-то... smile



--------------------
PM MAIL   Вверх
Леопольд
Дата 15.7.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(azesmcar @ 15.7.2009,  12:26)
там не было перегрузки, там были
Цитата(azesmcar @  14.7.2009,  20:13 Найти цитируемый пост)
два, абсолютно идентичных (по сигнатуре) оператора сравнения

и компилятор не знал какой из них вызывать, потому и ambiguous (неоднозначность).

Вроде бы "перегрузка" означает несколько функций с одинаковым именем, видимых в точке вызова. Если у пары (или больше) из них будет одинаковая сигнатура, то перегрузка не может быть разрешена однозначно. Т.е. здесь как раз возникла неоднозначность из-за того что "видны" две функции с одинаковым именем и одинаковой сигнатурой. Если это не перегрузка operator==, то как это ещё обозвать? smile

Это сообщение отредактировал(а) Леопольд - 15.7.2009, 14:20


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0591 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.