首页 > 解决方案 > 使用哈希模板特化相互引用的两个类

问题描述

我有两个类,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 但这感觉像是一个奇怪的解决方案,并没有真正解决像这样的依赖问题。我错过了什么吗?

标签: c++

解决方案


对于 的前向声明class B编译器的名称为,但对其属性(大小class B)一无所知。

这样您就不能使用它来定义std::unordered_map<B, int> map;,但您可以undefined std::unordered_map使用指针 (*) 或引用 (&)

static std::unordered_map<B, int> &map;

或者

std::unordered_map<B, int> *map;

推荐阅读