Неоднозначность при выборе функции
От: Аноним  
Дата: 30.08.07 17:45
Оценка: :)
Вот такой вот код:

#include <algorithm>
#include <vector>

using namespace std;

struct Foo {
  void sort() {
    vector<int> a;
    a.push_back(5);
    a.push_back(3);
    a.push_back(7);
    sort(a.begin(), a.end());
  }
};

int main() {
  return 0;
}


Компилирую G++ 4. Ругается, что, мол, нет подходящей функции. Говорит, что Foo::sort() -- единственный кандидат. А почему так?
Re: Неоднозначность при выборе функции
От: Awaken Украина  
Дата: 30.08.07 17:54
Оценка:
А>Компилирую 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. У них отличаются списки параметров. Разве компилер не должен найти нужную функцию? У Страуструпа этот случай рассматривается?
Re[3]: Неоднозначность при выборе функции
От: Awaken Украина  
Дата: 30.08.07 19:36
Оценка:
А>Но почему так, интересно? Ведь и std::sort и Foo::sort находятся в области видимости функции Foo::sort. У них отличаются списки параметров. Разве >компилер не должен найти нужную функцию? У Страуструпа этот случай рассматривается?

Фунции объявленные в различных областях видимости(не пространствах имен) не являются перегруженными
п.7.4.2 стр.194
Re[3]: Неоднозначность при выборе функции
От: Константин Л. Франция  
Дата: 30.08.07 20:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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 очередь не дошла.
Re[4]: Неоднозначность при выборе функции
От: Константин Л. Франция  
Дата: 31.08.07 10:46
Оценка:
Здравствуйте, Константин Л., Вы писали:

[]

КЛ>std::sort должен находиться как по 2 phase name lookup, так и по ADL. Но, видимо, 2pnl не работает в g++ 4, а до ADL очередь не дошла.


должен ли он находится по 2pnl? Вводит ли using namespace имена для поиска?

Т.е.

Имя по 2pnl будет искаться в

1. Объемлющем классе
2. неймспейсе, в котором находится объемлющий класс
3. в классах, которые являются базовыми для объемлющего класса
4. в их неймспейсах

в нашем случае объемлющий класс — Foo, его неймспейс — ::. вводит ли using namespace std; std в список рассматриваемых неймспейсов для поиска имен? По идее да.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.