Вызов foo
внутри Baz::foo()
будет искать только имена внутри класса. Если вы хотите использовать foo
, объявленный вне класса Baz
, вам необходимо использовать оператор разрешения области действия, например:
enum class Bar {
A
};
void foo(Bar) {}
struct Baz {
void foo() {
::foo(Bar::A); // looks up global 'foo'
}
};
Обратите внимание, что вызов unscoped для foo
завершается неудачно, потому что Bar::foo
находится в ближайшей области видимости. Если вы называете функцию по-другому, то в Bar
функция не найдена, и компилятор будет искать эту функцию во внешней области видимости.
enum class Bar {
A
};
void foo(Bar) {}
struct Baz {
void goo() { // not 'foo'
foo(Bar::A); // this is fine, since there is no 'Bar::foo' to find
}
};
Вот цитата из cppreference для определения класса .
e), если этот класс является членом пространство имен, или вложено в класс, который является членом пространства имен, или является локальным классом в функции, которая является членом пространства имен, область пространства имен ищется до определения класса, включающего в себя класс, или функция. если поиск для имени введен объявлением друга: в этом случае рассматривается только самое внутреннее пространство имен, в противном случае поиск продолжает охватывать пространства имен до обычной глобальной области.
Конечно, это относится только к определениям классов, но для функций-членов (это ваш пример), оно говорит:
Для имени используемый внутри тела функции-члена, аргумента по умолчанию для функции-члена, спецификации исключений для функции-члена или инициализатора члена по умолчанию, области поиска такие же, как в [определении класса], ...
То же самое относится c.