Доступ к глобальному пространству имен 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 потому что этот тип не объявлен в любом пространстве имен.

Другие вопросы по тегам