![](/img/trans.png)
[英]Invalid use of incomplete type struct std::hash with unordered_map with std::pair of enum class as key
[英]error: invalid use of incomplete type 'struct std::hash<>'
如何为密钥创建哈希函数,以作为在unordered_map中使用的字符串和枚举对?
我有以下一对,这是无序映射的关键,如何创建哈希以便可以在unordered_map中使用?
enum Color {
Red,
Green
};
typedef std::pair <std::string, Color>
我尝试了以下操作,但出现编译错误
struct EnumClassHash
{
template <typename T>
std::size_t operator()(T t) const
{
return static_cast<std::size_t>(t);
}
};
size_t hash( const PairType & pair ) {
return std::hash<std::string>()(pair.first) ^
std::hash<EnumClassHash>()(pair.second);
}
typedef std::unordered_map<PairType, std::string>,
std::function<decltype(hash)>> ColorMapType;
error: invalid use of incomplete type 'struct std::hash<EnumClassHash>'
std::hash<EnumClassHash>()(pairType.second);
以下都不起作用
size_t hash( const PairType & pairType ) {
return std::hash<std::string>()(pairType.first) ^
std::hash<Color>()(pairType.second);
}
typedef std::unordered_map<PairType, std::string, \
std::function<decltype(hash)>> ColorMapType;
ColorMapType colorMap(100, hash);
error: invalid use of incomplete type 'struct std::hash<Color>'
std::hash<Color>()(pair.second
);
PS请原谅我的格式。 我丢失了Gmail密码,只能从一个很小的屏幕的移动应用发布信息。
struct EnumClassHash
,它是它自己的事情,而不是std::hash
的特殊化。 std::hash<EnumClassHash>()(pair.second)
,模板专用化std::hash<EnumClassHash>
根本不存在。 您可以:
struct EnumClassHash
,并使用EnumClassHash
,或者 std::hash
专门化为std::hash<Color>
,然后使用std::hash<Color>
,或者 但切勿混用每种方法的一部分,这没有任何意义。
同样,要使用std::pair<std::string, Color>
作为std::unordered_map
的键类型, std::hash<Color>
或EnumClassHash
重要。 重要的是std::hash<std::pair<std::string, Color>>
或您自己的散列std::pair<std::string, Color>
。
这是您可以遵循的食谱。
要将std::pair<std::string, Color>
用作键类型,您需要自己专门设置std::hash<std::pair<std::string, Color>>
。
template <>
struct std::hash<std::pair<std::string, Color>>
{
std::size_t operator()(const std::pair<std::string, Color>& p) const {
return std::hash<std::string>()(p.first) ^ std::hash<Color>()(p.second);
}
};
但是在此之前,由于std::hash<std::pair<std::string, Color>>
使用它,因此首先需要专门化std::hash<Color>
。
template <>
struct std::hash<Color>
{
std::size_t operator()(Color c) const {
return static_cast<size_t>(c);
}
};
然后,您可以使用std::unordered_map<std::pair<std::string, Color>, std::string>
。 不涉及EnumClassHash
。
如果您非常喜欢EnumClassHash
,这是另一种方法。
您可以根据需要保留EnumClassHash
。
struct EnumClassHash
{
template <typename T>
std::size_t operator()(T t) const
{
return static_cast<std::size_t>(t);
}
};
这次, std::hash<Color>
不存在。 不要使用它。 (更不用说std::hash<EnumClassHash>
。)
因此,对键类型进行哈希处理的类应使用EnumClassHash
。 (再次,不是std::hash<EnumClassHash>
!)
struct PairHash {
std::size_t operator()(const std::pair<std::string, Color>& p) const {
return std::hash<std::string>()(p.first) ^ EnumClassHash()(p.second);
}
};
现在,您可以使用std::unordered_map<std::pair<std::string, Color>, std::string, PairHash>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.