зачем ставить пространство имен с помощью ::, например :: std :: vector - PullRequest
10 голосов
/ 07 февраля 2011

Я видел рабочий код, такой как

::std::vector<myclass> myvec;

Я понятия не имею, что означает предлог :: и почему он используется?

Например, см .:

C ++: правильный способ перебора контейнеров STL

Ответы [ 5 ]

20 голосов
/ 07 февраля 2011

Это полностью определяет имя, так что используется только шаблон vector в пространстве имен std в глобальном пространстве имен.В основном это означает:

{global namespace}::std::vector<myclass> myvec;

Может быть разница, если у вас есть объекты с одинаковыми именами в разных пространствах имен.Для простого примера, когда это может иметь значение, рассмотрим:

#include <vector>

namespace ns
{
    namespace std
    {
        template <typename T> class vector { };
    }

    void f() 
    { 
        std::vector<int> v1;   // refers to our vector defined above
        ::std::vector<int> v2; // refers to the vector in the Standard Library
    }        
};

Поскольку вам не разрешено определять свои собственные сущности в пространстве имен std, гарантируется, что ::std::vector всегда будет ссылатьсяконтейнер стандартной библиотеки.std::vector может относиться к чему-то другому.,

5 голосов
/ 07 февраля 2011

Ведущий "::" относится к глобальному пространству имен. Предположим, вы говорите namespace foo { .... Тогда std::Bar относится к foo::std::Bar, а ::std::Bar относится к std::Bar, что, вероятно, имеет в виду пользователь. Поэтому всегда включение начального "::" может защитить вас от обращения к неправильному пространству имен, если вы не уверены, в каком пространстве имен вы находитесь в данный момент.

3 голосов
/ 07 февраля 2011

Пример -

int variable = 20 ;

void foo( int variable )
{

    ++variable;      // accessing function scope variable
    ::variable = 40;  // accessing global scope variable
}
3 голосов
/ 07 февраля 2011

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

1 голос
/ 07 февраля 2011

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

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