命名空间范围问题

时间:2011-04-11 16:46:33

标签: c++ namespaces

我对命名空间范围有一个简单的问题:

  1. 我有两个名称空间,A和B,其中B嵌套在A中。
  2. 我在A。
  3. 中声明了一些typedef
  4. 我在B中声明了一个类(在A里面)
  5. 要从B内部访问typedef(在A中声明),我是否需要“使用命名空间A;”

    即:

    B.hpp:

    using namespace A;
    
    namespace A {
    namespace B {
    
      class MyClass {
    
        typedeffed_int_from_A a;
      };
    
    }
    }
    

    这似乎是多余的......这是正确的吗?

2 个答案:

答案 0 :(得分:4)

不,你不需要using指令;由于B嵌套在A内,A的内容在B内时属于范围。

答案 1 :(得分:4)

  

要从B内部访问typedef(在A中声明),我是否需要“使用命名空间A;”

没有。


但是,如果在命名空间B中定义了typedef或其他与namedef同名的符号,那么你需要写一下:

A::some_type a;

让我们做一个简单的实验来理解这一点。

请考虑以下代码:(必须阅读评论

namespace A
{
   typedef int some_type; //some_type is int

   namespace B
   {
        typedef char* some_type;  //here some_type is char*

        struct X
        {
               some_type     m; //what is the type of m? char* or int?
               A::some_type  n; //what is the type of n? char* or int?
        };

        void f(int) { cout << "f(int)" << endl; }
        void f(char*) { cout << "f(char*)" << endl; }
   }
}

int main() {
        A::B::X x;
        A::B::f(x.m);
        A::B::f(x.n);
        return 0;
}

输出:

f(char*)
f(int)

这证明m类型char*,而n类型int符合预期或意图。

在线演示:http://ideone.com/abXc8