Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ std::tr1::hash for a templated class

I have this templated class:

template <typename T> Thing { ... };

and I would like to use it in an unordered_set:

template <typename T> class Bozo {
  typedef unordered_set<Thing<T> > things_type;
  things_type things;
  ...
};

Now class Thing has everything it needs except a hash function. I would like to make this generic so I try something like:

namespace std { namespace tr1 {
  template <typename T> size_t hash<Thing<T> >::operator()(const Thing<T> &t) const { ... }
}}

Attempts to compile this with g++ 4.7 have it screaming

expected initializer before ‘<’

about the

hash<Thing<T> >

part of the declaration. Any clues will help save the few remaining hairs on my head.

like image 886
Roger March Avatar asked May 08 '13 22:05

Roger March


1 Answers

You cannot provide a specialization for just hash::operator()(const T&); just specialize the entire struct hash.

template<typename T>
struct Thing {};

namespace std { namespace tr1 {
    template<typename T>
    struct hash<Thing<T>>
    {
        size_t operator()( Thing<T> const& )
        {
            return 42;
        }
    };
}}

Another way to do this is to create a hasher for Thing, and specify this as the second template argument for the unordered_set.

template<typename T>
struct Thing_hasher
{
  size_t operator()( Thing<T>& const )
  {
    return 42;
  }
};

typedef std::unordered_set<Thing<T>, Thing_hasher<T>> things_type;
like image 184
Praetorian Avatar answered Oct 13 '22 17:10

Praetorian