ブルドッグと散歩に行こう:)
クラスが宣言されている名前空間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