0

我遇到了与这个问题类似的问题,但有一个额外的深度:

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 声明。

这发生在启用了 c++0x 选项的 g++ 4.5 中

4

2 回答 2

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
    }
}}}

这是缩进很重要的原因之一。

于 2012-04-15T20:15:13.613 回答
1

老问题,但我有同样的问题(或相同的症状),至少在我的情况下,这个问题非常棘手,所以发布它以防它帮助某人。

基本上,如果parent1childb从您的 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'
}
于 2018-09-12T18:53:52.190 回答