我有两个类,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> ↦
要么std::unordered_map<B, int> *map;
关于c++ - 两个类通过哈希模板专门化互相引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62585924/