c++ - 使用哈希模板特化相互引用的两个类
问题描述
我有两个类,A 和 B,它们都需要能够相互引用,如下所示。
// A.h
class B; // Forward declare B
template<>
struct std::hash<B>; // Forward declare hash template specialization for B
class A {
std::unordered_map<B, int> map;
};
// B.h
#include "A.h"
class B {
A object;
}
template<>
struct std::hash<B> {
size_t operator()(__in const B& toHash) const;
}
在目前的状态下,它告诉我error C2139: 'std::hash<B>': an undefined class is not allowed as an argument to compiler intrinsic type trait '__is_empty'
如果我不转发声明哈希模板专业化,它会告诉我在它已经使用后我不能声明它。
我还尝试将哈希模板专业化的定义移动到我现在要声明它的位置,这也给了我一个错误。
我该怎么做才能使它编译并按照我在这里列出的方式运行?
我唯一能想到的就是重新定义 B 来存储类似 a 的东西std::unique_ptr<A>
,前向声明 A 而不是 B,并让 A import Bh 而不是 B import Ah 但这感觉像是一个奇怪的解决方案,并没有真正解决像这样的依赖问题。我错过了什么吗?
解决方案
对于 的前向声明class B
,编译器的名称为,但对其属性(大小class B
)一无所知。
这样您就不能使用它来定义std::unordered_map<B, int> map;
,但您可以undefined
std::unordered_map
使用指针 (*) 或引用 (&)
static std::unordered_map<B, int> ↦
或者
std::unordered_map<B, int> *map;
推荐阅读
- android - 将深度传感器的图像放在主摄像头的原始图像之上
- eclipse - 安装了 Cucumber 插件,但功能文件在 Eclipse 中的普通文本编辑器中打开
- sockets - Windows 套接字接受()不返回
- reactjs - 在 JSX 和 HTML 的组合中给出 [object Object]
- python - 如何在另一个文本输入中获取选定的文本。收到错误“'ScreenManager'对象没有属性'widget_1'”
- c++ - 更一般的线程和套接字,线程和对象
- html - Overflow-X 出现在 body 而不是父 div 上
- python - 如何从变量创建路径?
- sentry - Sentry 可以在浏览器中捕获网络错误(XHR 或 fetch)吗?
- mysql - 在没有月度发票的情况下计算 MRR Kpi