嵌套的命名空间没有看到一个嵌套在另一个命名空间中的类,它使用了&using-directive'

时间:2013-03-17 00:22:20

标签: c++ visual-studio-2010 namespaces

命名空间'w'没有看到类'z',它通过使用“using namespace x :: y :: z;”嵌套在命名空间x :: y :: z中declaraion。我正在使用visual studio 2010.出了什么问题?

//...
namespace x
{
    namespace y
    {
        namespace z
        {
            class z
            {
            public:
                z(){};
            };
        }
    }
}
using namespace x::y::z; // normal declaration
namespace x
{
 namespace y
 {
  namespace w
  {
   class w
   {
    z object; // Here is the problem. Type 'z' is underlined in visual studio!
              // When I did like this:
              // x::y::z::z object;
              // everything is compiling properly
   };
  }
 }
}
int main()
{
    z object;       // no problem - I declared namespace above
    x::y::z::z object2; // also no problem
    return 1;
}

2 个答案:

答案 0 :(得分:2)

这是因为z命名空间和z类之间的名称冲突。例如,将班级名称更改为c,一切都可以正常工作here

顺便说一句,尽量避免使用 using-directive ,因为它有时会给你带来很多麻烦。

答案 1 :(得分:1)

是不是因为class w命名空间中的x::y::wx::y::z命名空间中的类z?

即使您说using namespace x::y::z,当您开始声明新空格时,我认为不会考虑这一点 - 意味着命名空间w无法看到z

但是,您可以利用x::yw共享z这一事实。您无法看到z CLASS,但是您可以看到z NAMESPACE,因为它位于yw也在其中)。所以你可以去:

class w {
    z::z object;
}

我测试过的一个小例子是:

#include <iostream>
namespace x {
    namespace y {
        namespace z {
            class z {
            public:
                z() { cout << "x::y::z::z" << endl; }
            }
        }
    }
}
namespace x {
    namespace y {
        namespace w {
            class w {
                z::z object;
            public:
                w() { cout << "x::y::w::w" << endl; }
            }
        }
    }
}
int main(int argc, char* argv[]) {
    x::y::w::w object;
    return 0;
}

这个的输出是:

x::y::z::z
x::y::w::w