The signature of the unordered_map class is this:
template<class Key, class Ty, class Hash = std::hash<Key>, class Pred = std::equal_to<Key>, class Alloc = std::allocator<std::pair<const Key, Ty> > > class unordered_map;
Your example works because by default Pred, std :: equal_to <> by default checks equality using the == operator. The compiler finds your function foo :: operator == member and uses this.
std :: hash does not have a specialization that will call a member function in your class, so you cannot just add a member to foo with a custom hash. You will need to specialize in std :: hash. If you want to call a member function in foo, go ahead. You will get something like this:
struct foo { size_t hash() const { // hashing method here, return a size_t } }; namespace std { // Specialise std::hash for foo. template<> class hash< foo > : public unary_function< foo, size_t > { public: size_t operator()( const foo& f ) { return f.hash(); } }; }
source share