指的是堂兄名称空间

时间:2012-04-15 20:12:51

标签: c++ namespaces

我遇到类似于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选项

2 个答案:

答案 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)

老问题,但是我有相同的问题(或相同的症状),至少就我而言,这个问题非常棘手,因此发布以防万一。

基本上,如果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'
}