А>Компилирую G++ 4. Ругается, что, мол, нет подходящей функции. Говорит, что Foo::sort() -- единственный кандидат. А почему так?
потому что внутри Foo {} sort перекрывает std::sort
используй явное указание namespace для выбора "правильной" функции
вообще глобальный using namespace это зло имхо. только для учебных примеров годится
Re[2]: Неоднозначность при выборе функции
От:
Аноним
Дата:
30.08.07 18:38
Оценка:
Здравствуйте, Awaken, Вы писали:
A>потому что внутри Foo {} sort перекрывает std::sort A>используй явное указание namespace для выбора "правильной" функции A>вообще глобальный using namespace это зло имхо. только для учебных примеров годится
Но почему так, интересно? Ведь и std::sort и Foo::sort находятся в области видимости функции Foo::sort. У них отличаются списки параметров. Разве компилер не должен найти нужную функцию? У Страуструпа этот случай рассматривается?
А>Но почему так, интересно? Ведь и std::sort и Foo::sort находятся в области видимости функции Foo::sort. У них отличаются списки параметров. Разве >компилер не должен найти нужную функцию? У Страуструпа этот случай рассматривается?
Фунции объявленные в различных областях видимости(не пространствах имен) не являются перегруженными
п.7.4.2 стр.194
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Awaken, Вы писали:
A>>потому что внутри Foo {} sort перекрывает std::sort A>>используй явное указание namespace для выбора "правильной" функции A>>вообще глобальный using namespace это зло имхо. только для учебных примеров годится
А>Но почему так, интересно? Ведь и std::sort и Foo::sort находятся в области видимости функции Foo::sort. У них отличаются списки параметров. Разве компилер не должен найти нужную функцию? У Страуструпа этот случай рассматривается?
std::sort должен находиться как по 2 phase name lookup, так и по ADL. Но, видимо, 2pnl не работает в g++ 4, а до ADL очередь не дошла.
[]
КЛ>std::sort должен находиться как по 2 phase name lookup, так и по ADL. Но, видимо, 2pnl не работает в g++ 4, а до ADL очередь не дошла.
должен ли он находится по 2pnl? Вводит ли using namespace имена для поиска?
Т.е.
Имя по 2pnl будет искаться в
1. Объемлющем классе
2. неймспейсе, в котором находится объемлющий класс
3. в классах, которые являются базовыми для объемлющего класса
4. в их неймспейсах
в нашем случае объемлющий класс — Foo, его неймспейс — ::. вводит ли using namespace std; std в список рассматриваемых неймспейсов для поиска имен? По идее да.