Подпись класса unordered_map такова:
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;
Ваш пример работает, потому что Pred по умолчанию, std :: equal_to <>, по умолчанию проверяет равенство, используя operator ==.Компилятор находит вашу функцию-член foo :: operator == и использует ее.
std :: hash не имеет никакой специализации, которая будет вызывать функцию-член в вашем классе, поэтому вы не можете просто добавитьчлен foo с пользовательским хешем.Вместо этого вам нужно будет специализировать std :: hash.Если вы хотите, чтобы это вызывало функцию-член на foo, продолжайте.Вы получите что-то вроде этого:
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();
}
};
}