Пространства имен уточнены с :: в C ++ - PullRequest
7 голосов
/ 31 августа 2010

Что это означает, если пространство имен в C ++ определено с ::? Например ::testing::Test.

Ответы [ 5 ]

19 голосов
/ 31 августа 2010

:: - оператор разрешения области.Это всегда означает «поиск в глобальном пространстве имен символа справа».Например:

namespace testing {
    int a = 1;
}

namespace foo {
    namespace testing {
        int a = 2;
    }

    int b = ::testing::a; // b has the value 1
    int c = testing::a; // c has the value 2
}
5 голосов
/ 31 августа 2010

Это означает, что упоминаемое пространство имен testing относится к пространству глобальных имен, а не к другому вложенному пространству имен с именем testing.

.

Рассмотрим следующий угловой случай и, возможно, пример плохого дизайна:

namespace foo
{
    struct gizmo{int n_;};
    namespace bar
    {
        namespace foo
        {
            float f_;
        };
    };

};

int main()
{
    using namespace foo::bar;

    ::foo::gizmo g;
    g.n_;
}

Есть 2 пространства имен с именем foo. Одним из них является свисание верхнего уровня с «глобального» пространства имен, а другое вложено в foo::bar. затем мы переходим к using namespace foo::bar, что означает, что любая безусловная ссылка на gizmo подберет такую ​​же в foo::bar::foo. Если мы действительно хотим получить значение в foo, то мы можем использовать для этого явную квалификацию:

::foo::gizmo

3 голосов
/ 31 августа 2010

I, если перед именем переменной стоит ::, она преобразуется в глобальную область видимости.Таким образом, вы можете проводить как локальные переменные, так и глобальные переменные, и различать их.

#include <iostream>

using namespace std;
int testing = 37;

int main()
{
   int testing = 42;

   cout << ::testing << ' ' << testing << endl;
}

Вывод будет 37 42

3 голосов
/ 31 августа 2010

Если :: используется слева, это означает глобальную область.

Если вы хотите провести аналогию с файловой системой, testing::Test будет своего рода относительным путем (относительно * 1005).* König lookup ) тогда как ::testing::Test будет абсолютным путем.Надеюсь, эта аналогия прояснит ситуацию и не помешает вам: -).

0 голосов
/ 31 августа 2010

Это вызывает то, что называется qualified name lookup:

$ 3.4.3 / 1 - «На имя члена класса или пространства имен можно ссылаться после оператора :: scope resolution (5.1), примененного к вложенномуспецификатор-имени, который назначает его класс или пространство имен. При поиске имени, предшествующего оператору разрешения :: области действия, имена объектов, функций и перечислителей игнорируются. Если найденное имя не является именем класса (раздел 9)namespace-name (7.3.1), программа некорректна. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...