Доступ к глобальному пространству имен C++ из другого пространства имен
В приведенном ниже коде C++ foobar
определяется первым для одного double
параметр, а затем снова для одного параметра типа Foo
, Оба определены в глобальном пространстве имен.
В пределах one
пространство имен, дальнейшая перегрузка foobar
определяется с одним параметром типа Bar
, Из этой версии foobar
безоговорочный вызов foobar
с double
Аргумент (42.0) потерпит неудачу. Похожий вызов foobar
, на этот раз уточняется оператором разрешения области видимости (::), а также double
аргумент, хотя удастся.
С другой стороны, безоговорочный вызов foobar
с аргументом типа Foo
, успешно. Вызов foobar
с Foo
Аргумент, определяемый оператором разрешения контекста, также завершается успешно.
Почему два сценария ведут себя по-разному? Я использую как gcc 4.7, так и clang++ 3.2.
struct Foo {};
struct Bar {};
double foobar(double x) { return x; }
Foo foobar(Foo f) { return f; }
namespace one {
Bar foobar(Bar b) {
//foobar(42.0); // error: can't convert to Bar
::foobar(42.0);
Foo f;
foobar(f); // no problem
::foobar(f);
return b;
}
};
1 ответ
В вызове foobar(f)
функции из пространства имен Foo
будет рассматриваться.
Не работает для double
потому что этот тип не объявлен в любом пространстве имен.