ブルドッグと散歩に行こう:)
クラスが宣言されている名前空間Street::House
( namespace 内)があるとします( in にします):Street
Bulldog
House/Bulldog.hpp
namespace Street {
namespace House {
class Bulldog {};
}
}
次に、私は持っていBulldog.hpp
ます:
#include "House/Bulldog.hpp"
namespace Street {
using House::Bulldog;
}
何が起こっているかに注意してください:宣言と同様に、宣言Street::House::Bulldog
を名前空間に挿入しています。Street
Street::Bulldog
using
次に、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 に移動することです。ただし、これにより、前方宣言ではなく正確な包含が行われます。Bulldog
Owner.hpp
#include "Bulldog.hpp"
Owner.cpp
Owner.hpp