我有两个类,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 import B.h而不是B importA.h。但这感觉像是一个奇怪的解决方案,并未真正解决像这样的依赖问题。我想念什么吗?

最佳答案

对于class B的前向声明,编译器的名称为class B,但对其属性一无所有( size )。
这样就无法使用它来定义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/

10-11 22:38