gpt4 book ai didi

c++ - 错误 : invalid use of incomplete type 'struct std::hash<>'

转载 作者:行者123 更新时间:2023-11-28 01:38:33 25 4
gpt4 key购买 nike

如何为要在 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>作为 key 类型,您需要专门化 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<Color>std::hash<std::pair<std::string, 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> .

关于c++ - 错误 : invalid use of incomplete type 'struct std::hash<>' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48294401/

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