命名空间'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;
}
答案 0 :(得分:2)
这是因为z
命名空间和z
类之间的名称冲突。例如,将班级名称更改为c
,一切都可以正常工作here。
答案 1 :(得分:1)
是不是因为class w
命名空间中的x::y::w
和x::y::z
命名空间中的类z?
即使您说using namespace x::y::z
,当您开始声明新空格时,我认为不会考虑这一点 - 意味着命名空间w
无法看到z
但是,您可以利用x::y
和w
共享z
这一事实。您无法看到z
CLASS,但是您可以看到z
NAMESPACE,因为它位于y
(w
也在其中)。所以你可以去:
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