让我们和斗牛犬一起散步吧:)

假设我有一个命名空间 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 的 声明作为 StreetStreet::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/

10-10 00:58