Using声明和Forward声明的冲突
Conflict between Using Declaration and Forward Declaration
让我们和牛头犬一起去散步吧:)
说我有一个命名空间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
类视为不同的,但是为什么呢?在这种情况下,我看不到任何歧义,也就是说,如果编译器正确实现,它实际上可以工作。
你有什么建议吗?我能想到的一种方法是简单地从Owner.hpp
中删除Bulldog
的前向声明,并将#include "Bulldog.hpp"
从Owner.cpp
移动到Owner.hpp
。但是,这将导致精确包含而不是前向声明。
似乎你可以通过改变Bulldog.hpp
说
namespace Street {
namespace House {
class Bulldog;
}
using House::Bulldog;
// ...
}
Owner.hpp
,你写的是:
namespace Street {
class Bulldog;
class Owner {
Bulldog* bulldog;
};
}
应该改成
namespace Street {
namespace House {
class Bulldog;
}
class Owner {
House::Bulldog* bulldog;
};
}
您不小心转发声明了Street::Bulldog
,这不是一个真正的类,而不是Street::House::Bulldog
,其中是一个真正的类。因此,您在Owner.cpp
中的实现因为Bulldog*
是模糊的而感到不安。它不知道您是指已声明的类Street::Bulldog
还是已声明的(也定义了,尽管编译器不关心) Street::House::Bulldog
.
由于您想要转发声明的类是Street::House::Bulldog
,因此您需要在.hpp
文件的声明中包含第二个House
名称空间。
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 错误:使用通用引用的声明冲突
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- 具有相同名称的方法和内部类(错误:.. 与前面的声明冲突)
- 重载与使用声明冲突
- 错误:多个文件中的结构声明冲突
- C++ h 和 cpp 文件中的指针声明冲突
- constexpr静态结构类成员的声明冲突
- C++ 中的声明冲突
- 解耦嵌套类:使用模板别名时出现"模板声明冲突"错误
- 错误:声明冲突 - 指针不能是 int
- 声明冲突
- C++问题:声明冲突
- 使用 FreeTDS 库时出现声明冲突的声明“typedef int RETCODE”错误
- 如何解决编译器枚举重新声明冲突
- sys/types.h和linux/types.小时的重新声明冲突
- C 中的外部类型声明冲突
- C 函数的声明'void msgBox(const char*, const char*)'与先前的声明冲突
- 静态QMap的声明冲突
- 模板、静态变量和诸如此类的声明冲突