我遇到类似于this question的问题,但有一个额外的深度:
namespace root { namespace parent1 { namespace childa {
class hard_to_get_at{};
}}}
namespace root { namespace parent2 { namespace childb {
// how do I refer refer to namespace childb relative to the current namespace ?
void someFunc()
{
parent1::childa::hard_to_get_at instance; // does not work
}
}}}
当我尝试上述操作时,我收到错误
错误:'root :: parent2 :: childb :: parent1 :: childa'尚未声明
我不明白为什么这不起作用,我得到它应该的印象。我真的不想在someFunc
函数中放置一个using声明。
这发生在g ++ 4.5中,启用了c ++ 0x选项
答案 0 :(得分:2)
你遗漏了一些左括号:
namespace root { namespace parent1 { namespace childa { // <--- here
class hard_to_get_at{};
}}}
namespace root { namespace parent2 { namespace childb { // <--- and here
// how do I refer refer to namespace childb relative to the current namespace ?
void someFunc()
{
parent1::childa::hard_to_get_at instance; // does not work
}
}}}
这是缩进很重要的原因之一。
答案 1 :(得分:1)
老问题,但是我有相同的问题(或相同的症状),至少就我而言,这个问题非常棘手,因此发布以防万一。
基本上,如果parent1
是childb
内TU中可见的命名空间,则查找将失败。例如:
namespace a { namespace b { namespace c {
class hard_to_get_at {};
}}}
namespace a { namespace d { namespace e {
namespace b {} // May be in any included '.h'
void f() {
b::c::hard_to_get_at foo; // Previous line introduced a::d::e::b which is found before a::b, compiler doesn't backtrack when a::d::e::b::c isn't found.
}
}}}
虽然我看不到所有代码,但我想这实际上是OP的问题,因为错误消息“ error: 'root::parent2::childb::parent1::childa' has not been declared
”表明编译器找到了命名空间root::parent2::childb::parent1
在那里寻找childa
。
顺便说一句,可以用更少的嵌套来复制它,这使问题更加明显:
namespace a {
class Foo {};
}
namespace b {
namespace a {}
void f() { a::Foo foo; } // This will fail because 'a' here is '::b::a'
}