Какое правило поиска не позволяет компилятору найти функцию?
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); }
};