0

私はこの質問に似た問題を抱えていますが、1つの追加の深さがあります:

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' が宣言されていません

これが機能しない理由がわかりません。そうすべきだという印象を受けます。関数内に using 宣言を入れる必要は本当にありませんsomeFunc

これは、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
    }
}}}

これがインデントが重要な理由の 1 つです。

于 2012-04-15T20:15:13.613 に答える
1

古い質問ですが、同じ問題(または同じ症状)がありました。少なくとも私の場合、問題は非常にトリッキーだったので、誰かに役立つ場合に備えて投稿してください。

基本的に、がTU から見える任意parent1の場所にある名前空間である場合、ルックアップは失敗します。childb例えば:

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

確かにすべてのコードを確認することはできませんが、エラーメッセージ " " は、コンパイラが名前空間を探している場合にerror: 'root::parent2::childb::parent1::childa' has not been declared名前空間を見つけたことを示唆しているため、これは実際には OP の問題であったと思います。root::parent2::childb::parent1childa

ちなみに、これはより少ないネスティングで複製できるため、問題がより明白になります。

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 に答える