std :: hash ]的转发声明。 我有多个类,它们会重载std :: hash operator()。比方说: A.h class A { ... } namespace std { template<typename T> struct hash; } A.cpp template<> struct std::hash<A> { public: virtual std::size_t operator()(const A& joint) const noexcept { .. } 和类似的类,假设class B和class C 现在class B使用A的哈希,例如: boost::hash_combine(h, std::hash<A>{}(b.getA()) 问题:error: use of deleted function std::hash<A>::hash() 我尝试过:A.h namespace std { template<typename T> struct hash; } B.h class B { friend struct std::hash<A>; } 我有多个类,它们会重载std :: hash operator()。假设:A.h类A {...}命名空间std {template struct hash; } A.cpp template <> struct std :: hash&... 您必须在std::hash<A>中定义A.h专业化,以便B和C能够看到该专业化存在并且具有operator()成员。 如果B和C无法“看到” std::hash<A>专业化,则它们将实例化主要的std::hash模板,该模板已禁用,因为标准库不知道如何对用户进行哈希处理-定义的类型A。 如果在std::hash<A>中声明了A.h特化,但未定义,则B和C会将其视为不完整的类,这意味着无法调用operator()。 因此您必须在std::hash<A>中定义A.h。但是,std::hash<A>::operator()的实现可以在A.h或A.cpp中。

问题描述 投票:0回答:1
我有多个类,它们会重载std :: hash operator()。比方说:

A.h

class A { ... } namespace std { template<typename T> struct hash; } A.cpp template<> struct std::hash<A> { public: virtual std::size_t operator()(const A& joint) const noexcept { .. }

和类似的类,假设class Bclass C

现在class B使用A的哈希,例如:

boost::hash_combine(h, std::hash<A>{}(b.getA())

问题:error: use of deleted function std::hash<A>::hash()

我尝试过:A.h

namespace std { template<typename T> struct hash; }

B.h

class B { friend struct std::hash<A>; }

我有多个类,它们会重载std :: hash operator()。假设:A.h类A {...}命名空间std {template 

struct hash; } A.cpp template <> struct std :: hash&...

c++ hash
1个回答
0
投票
您必须在std::hash<A>中定义A.h专业化,以便BC能够看到该专业化存在并且具有operator()成员。

如果BC无法“看到” std::hash<A>专业化,则它们将实例化主要的std::hash模板,该模板已禁用,因为标准库不知道如何对用户进行哈希处理-定义的类型A

© www.soinside.com 2019 - 2024. All rights reserved.