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

标签 c++ hash hashmap unordered-map

如何为要在 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/

相关文章:

c++ - 函数的两个版本不会产生相同的结果

java - 我的(字符串).split ("=");不工作吗?

java - 将值从存储在 HashMap 中的列表添加到新列表时遇到问题 - Java

c++ - 当程序在两者之间进入休眠状态时,OpenCV 函数 cv::remap() 的执行时间更长

C++ 如何将可变字符数组从一个函数传递到另一个函数

ruby-on-rails - 将 ruby​​ 哈希转换为 json 对象

ruby-on-rails - 如何按 Ruby 中的不同元素对混合数组进行排序?

Java直接引用哈希值

javascript - JavaScript 中的删除运算符如何工作?

c++ - Eclipse 中的 Cmake 支持