gpt4 book ai didi

c++ - 两个类通过散列模板特化相互引用

转载 作者:行者123 更新时间:2023-12-01 14:29:14 26 4
gpt4 key购买 nike

我有两个类,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 来存储类似 std::unique_ptr<A> 的东西,转发声明 A 而不是 B,并且让 A 导入 B.h 而不是 B 导入 A.h。但这感觉像是一个奇怪的解决方案,并没有真正解决这样的依赖问题。我错过了什么吗?

最佳答案

前向声明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;

关于c++ - 两个类通过散列模板特化相互引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62585924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com