Какое правило поиска не позволяет компилятору найти функцию?

void Foo(int i)
{
}
struct Bar
{
    static void Foo() { Foo(1); }
};

Вышеприведенный код не компилируется. Он не может найти Foo(int). Зачем? Я знаю, что это связано с тем же именем функции, но не понимает проблему.

Почему мне нужен квалифицированный поиск?

Ответы

Ответ 1

От 3.4.1 (выделено мной)

Во всех случаях, перечисленных в 3.4.1, области поиска ищут декларацию в порядке, указанном в каждом из соответствующие категории; поиск имени заканчивается, как только будет найдено объявление для имени. Если декларация не найдено, программа плохо сформирована.

В этом конкретном случае первой областью поиска является локальная область функции. Foo там не встречается. Затем появляется класс. Поскольку в нем найдено имя Foo, поиск имени останавливается там, а другой Foo вообще не участвует в разрешении перегрузки.

Ответ 2

Если функция в определенном пространстве имен имеет то же имя, что и имя в глобальном пространстве имен, то одно в глобальном пространстве имен не будет найдено.

К сожалению, стандарт С++ не позволяет вам вводить глобальное пространство имен в текущее с соответствующим оператором using, хотя вы можете использовать using ::Foo; для выполнения этой конкретной функции:

void Foo(char)
{
}

struct Bar
{
    static void Foo(double) { }
    static void Foo() {
        using ::Foo;
        Foo('c'); // correct overload is found since ::Foo is pulled into scope
        Foo(3.0);
    }
};

В противном случае вам нужно использовать оператор разрешения области видимости для поиска глобальной функции:

struct Bar
{
    static void Foo() { ::Foo(1); }
};