зачем добавлять пространство имен, например: std:: vector

Я видел производственный код, такой как

::std::vector<myclass> myvec;

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

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

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

5 ответов


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


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

{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 возможно, это относится к чему-то еще. .


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


взяв пример -

int variable = 20 ;

void foo( int variable )
{

    ++variable;      // accessing function scope variable
    ::variable = 40;  // accessing global scope variable
}

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