代码之家  ›  专栏  ›  技术社区  ›  Leonid

用C++实现的命名空间:C++

  •  7
  • Leonid  · 技术社区  · 14 年前

    如果C++中的命名空间符合条件,这意味着什么? :: ? 例如 ::testing::Test .

    5 回复  |  直到 14 年前
        1
  •  23
  •   Peter Ruderman    14 年前

    :: 是范围解析运算符。它总是表示“在全局命名空间中搜索右侧的符号”。例如:

    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
    }
    
        2
  •  5
  •   John Dibling    14 年前

    这意味着 testing 所引用的命名空间是全局命名空间之外的命名空间,而不是另一个名为 测试

    考虑一下下面的情况,可能是一个糟糕设计的例子:

    namespace foo
    {
        struct gizmo{int n_;};
        namespace bar
        {
            namespace foo
            {
                float f_;
            };
        };
    
    };
    
    int main()
    {
        using namespace foo::bar;
    
        ::foo::gizmo g;
        g.n_;
    }
    

    有两个名为 foo foo::bar using namespace foo::bar ,指任何无保留的引用 gizmo 我来接你的 foo::bar::foo 然后我们可以使用一个明确的限定:

    ::foo::gizmo

        3
  •  3
  •   jdehaan    14 年前

    如果 ::

    如果你想和文件系统做个类比, testing::Test König lookup )鉴于 ::testing::Test 绝对是条路。我希望这个比喻能使它更清楚,不要让你的头脑混乱:-)。

        4
  •  3
  •   Wade Tandy    14 年前

    #include <iostream>
    
    using namespace std;
    int testing = 37;
    
    int main()
    {
       int testing = 42;
    
       cout << ::testing << ' ' << testing << endl;
    }
    

    输出将是

        5
  •  0
  •   Chubsdad    14 年前

    这引发了一种叫做 qualified name lookup: