Как исправить: "constructed value does not match the lookup key" в absl::flat_hash_set
Я использую реализацию set от abseil. И когда я изменил функцию сравнения для Indexed<T_>:
было:
template<typename T_>
auto Indexed<T_>::operator==(Indexed<T_> const& indexed) const -> bool {
return indexed.id_ == id_;
}
стало:
template<typename T_>
auto Indexed<T_>::operator==(Indexed<T_> const& indexed) const -> bool {
return indexed.id_ == id_ && id_ != 0;
}
я получаю:
Interface_Engine_ex: .../abseil-src/absl/container/internal/raw_hash_set.h:3156:
void absl::container_internal::raw_hash_set<
absl::container_internal::FlatHashSetPolicy<ie::Indexed<ie::TextStyle>>,
absl::hash_internal::Hash<ie::Indexed<ie::TextStyle>>,
std::equal_to<ie::Indexed<ie::TextStyle>>,
std::allocator<ie::Indexed<ie::TextStyle>>>::emplace_at(size_t, Args &&...)
[Policy = absl::container_internal::FlatHashSetPolicy<ie::Indexed<ie::TextStyle>>,
Hash = absl::hash_internal::Hash<ie::Indexed<ie::TextStyle>>,
Eq = std::equal_to<ie::Indexed<ie::TextStyle>>,
Alloc = std::allocator<ie::Indexed<ie::TextStyle>>,
Args = <ie::Indexed<ie::TextStyle>>]:
Assertion `PolicyTraits::apply(FindElement{*this}, *iterator_at(i)) == iterator_at(i) &&
"constructed value does not match the lookup key"' failed.
При этом хеш-функция выглядит так:
template<typename T_>
auto std::hash<ie::Indexed<T_> >::operator()(ie::Indexed<T_> const& indexed) -> size_t{
return indexed.get_id();
}
Ответы (1 шт):
Автор решения: Andrewkoro105
→ Ссылка
Помогло изменение функции сравнения на:
template<typename T_>
auto Indexed<T_>::operator==(Indexed<T_> const& indexed) const -> bool {
return (indexed.id_ == id_ && id_ != 0) || this == &indexed;
}