让我们和牛头犬一起散步 :)
假设我有一个命名空间Street::House
(在命名空间Street
内),其中声明了Bulldog
类(假设它在House/Bulldog.hpp
中):
namespace Street {
namespace House {
class Bulldog {};
}
}
然后,我有一个名为
Bulldog.hpp
的文件:#include "House/Bulldog.hpp"
namespace Street {
using House::Bulldog;
}
注意以下内容:我正在使用using
声明将Street::House::Bulldog
的定义注入到命名空间Street
中,并将其作为Street::Bulldog
。
然后,在 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中出现编译错误:
错误:'Bulldog'在此范围内已经声明过
这种现象的自然解释似乎是C ++将这两个Bulldog类视为不同,但为什么呢?在这种情况下,我没有看到任何歧义,即如果编译器正确实现它,它实际上可以工作。
你能提出哪些解决方法?我能想到的一个方法是从Owner.hpp中简单地删除Bulldog的前向声明,并将#include“Bulldog.hpp”从Owner.cpp移动到Owner.hpp。然而,这将导致精确的包含,而不是前向声明。
error: target of using declaration conflicts with declaration already in scope
。 - Lily Ballard