让我们和斗牛犬一起散步吧:)
假设我有一个命名空间 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
声明注入(inject)到命名空间 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
类视为不同,但为什么呢?在这种情况下,我看不出任何歧义,即如果编译器正确实现,它实际上可以工作。您可以建议哪些解决方法?我能想到的一个是简单地从
Bulldog
中删除 Owner.hpp
的 前向声明 并将 #include "Bulldog.hpp"
从 Owner.cpp
移动到 Owner.hpp
。但是,这将导致精确包含而不是 前向声明 。 最佳答案
看来你可以通过改变 Bulldog.hpp
来解决这个问题
namespace Street {
namespace House {
class Bulldog;
}
using House::Bulldog;
// ...
}
这在 Clang 中对我有用。
关于c++ - 使用声明和前向声明之间的冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15375051/