Я пытаюсь определить свою собственную функцию хеширования для std::unordered_map, и я хочу хешировать поле в структуре, которое должно быть ключом. Код ниже - это упрощенная версия того, что у меня есть:
struct TestStruct {
char a[64];
char b[64];
}
struct my_eq {
bool operator()(const TestStruct& test_1, const TestStruct& test_2) const {
return !strcmp(test_1.a, test_2.a) && !strcmp(test_1.b, test_2.b);
}
};
struct my_hash {
unsigned long operator()(const TestStruct& test) const {
return std::hash<std::string_view>(std::string_view(test.a));
}
};
std::unordered_map<TestStruct, int, my_hash,my_eq> map;
Я получаю следующую ошибку:
no matching function for call to ‘std::hash<std::basic_string_view<char> >::hash(std::string_view&)
Согласно cppreference на std::hash хеш-функция должна поддерживать std::string_view. Я чувствую, что упускаю что-то простое, но не могу этого понять.
@patatahooligan -std=c++1z - текущий флаг компилятора.
@Galik отличный улов. это привело бы к досадной ошибке. Я обновлю свой пост предлагаемыми исправлениями (за исключением хеш-исправления c)





std::hash - это шаблон класса, нет - шаблон функции. вам нужен экземпляр для его вызова:
return std::hash<std::string_view>()(std::string_view(test.a));
Вы неправильно используете std::hash. std::hash - это класс, который предоставляет operator(), который хеширует объект. Вы пытаетесь передать объект его конструктору, который не работает, поскольку у него есть только consdtructor по умолчанию. Ваш operator() также должен быть помечен как const. Собираем все вместе и получаем:
struct my_hash {
unsigned long operator()(const TestStruct& test) const {
return std::hash<std::string_view>()(std::string_view(test.a));
}
};
Вы уверены, что компилируете C++ 17? Я полагаю, что C++ 14 по-прежнему используется по умолчанию для многих компиляторов.