2

命名空间 'w' 没有看到通过使用“使用命名空间 x::y::z;”嵌套在命名空间 x::y::z 中的类 'z' 声明。我正在使用 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;
}
4

2 回答 2

2

这是因为 z命名空间和z类之间的名称冲突。将类名更改c为例如,一切都会像这里一样正常工作。

顺便说一句,尽量避免using-directive,因为它有时会让人头疼。

于 2013-03-17T03:17:25.323 回答
1

不是因为你已经class wx::y::w命名空间和命名空间中的类 z 中了x::y::z吗?

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

但是,您可以做的是利用和x::y共享的事实。你看不到CLASS,但你可以看到NAMESPACE,因为它在里面(也在里面)。所以你可以去:wzzzyw

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
于 2013-03-17T00:34:02.930 回答