4

ブルドッグと散歩に行こう:)

クラスが宣言されている名前空間Street::House( namespace 内)があるとします( in にします):StreetBulldogHouse/Bulldog.hpp

namespace Street {
namespace House {
class Bulldog {};
}
}

次に、私は持っていBulldog.hppます:

#include "House/Bulldog.hpp"    

namespace Street {
using House::Bulldog;
}

何が起こっているかに注意してください:宣言と同様に、宣言Street::House::Bulldog を名前空間に挿入しています。StreetStreet::Bulldogusing

次に、Owner.hppクラスBulldog前方宣言されている場所があります。

namespace Street {
class Bulldog;

class Owner {
  Bulldog* bulldog;
};
}

最後に、私は持っていOwner.cppます:

#include "Owner.hpp"
#include "Bulldog.hpp"

namespace Street {
// Implementation of Owner...
}

次の場所でコンパイル エラーが発生しますOwner.cpp

error: 'Bulldog' is already declared in this scope

この現象の自然な説明は、C++ がこれら 2 つのBulldogクラスを異なるものとして扱うということのようですが、なぜでしょうか? この場合、あいまいさは見られません。つまり、コンパイラによって適切に実装されていれば、実際に機能する可能性があります。

どのような回避策を提案できますか? 私が考えることができるのは、単に from の前方宣言を削除し fromからto に移動することです。ただし、これにより、前方宣言ではなく正確な包含が行われます。BulldogOwner.hpp#include "Bulldog.hpp"Owner.cppOwner.hpp

4

2 に答える 2

3

Bulldog.hpp言うように変更することでこれを修正できるようです

namespace Street {
    namespace House {
        class Bulldog;
    }
    using House::Bulldog;

    // ...
}

これはClangで機能します。

于 2013-03-13T00:52:48.293 に答える
1

Owner.hppあなたは次のように書きました:

namespace Street {
class Bulldog;

class Owner {
  Bulldog* bulldog;
};
}

代わりにすべきだった

namespace Street {
namespace House {
class Bulldog;
}

class Owner {
  House::Bulldog* bulldog;
};
}

実際のクラスであるStreet::Bulldogの代わりに、実際のクラスではない をStreet::House::Bulldog誤って前方宣言していました。したがって、あなたの実装はあいまいだったので動揺しました。宣言されたクラスまたは宣言されたクラスを参照しているかどうかはわかりません(コンパイラはそれを気にしませんが、定義されています)。Owner.cppBulldog*Street::BulldogStreet::House::Bulldog

転送宣言したいクラスはであるため、ファイルの宣言に 2 番目の名前空間Street::House::Bulldogを含める必要があります。House.hpp

于 2014-09-23T18:43:08.503 に答える