让我们和斗牛犬一起去散步吧:)
假设我有一个命名空间Street::House
(在命名空间内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++ 将这两个Bulldog
类视为不同的,但为什么呢?在这种情况下,我看不出有任何歧义,即如果编译器正确实施,它实际上可以工作。
你能建议什么解决方法?我能想到的一种方法是简单地删除from和 move from to的前向声明。但是,这将导致精确包含而不是前向声明。Bulldog
Owner.hpp
#include "Bulldog.hpp"
Owner.cpp
Owner.hpp