为什么在名称空间前加上::,例如:: std :: vector

时间:2011-02-07 19:10:56

标签: c++ namespaces

我见过生产代码,例如

::std::vector<myclass> myvec;

我不知道前置::的含义是什么 - 为什么要使用?

有关示例,请参阅:

C++: Proper way to iterate over STL containers

5 个答案:

答案 0 :(得分:19)

这完全限定了名称,因此只使用全局命名空间中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可能会引用别的东西。 。

答案 1 :(得分:5)

前导“::”指的是全局命名空间。假设您说namespace foo { ...。然后std::Bar引用foo::std::Bar,而::std::Bar引用std::Bar,这可能是用户的意思。因此,如果您不确定当前所在的命名空间,那么始终包含初始“::”可以保护您不会引用错误的命名空间。

答案 2 :(得分:3)

始终从标准库中获取vector。如果我使用它的代码位于命名空间std::vector中,mycompany::std::vector也可能是mycompany

答案 3 :(得分:3)

举个例子 -

int variable = 20 ;

void foo( int variable )
{

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

答案 4 :(得分:1)

以::开头意味着将命名空间重置为全局命名空间。如果你试图在你的代码中解决一些含糊之处,那么它可能会很有用。