模板化类的C ++ std :: tr1 :: hash

时间:2013-05-08 22:20:34

标签: c++ templates hash unordered

我有这个模板类:

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

我想在unordered_set中使用它:

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

现在,除了哈希函数之外,类Thing具有所需的一切。我想制作这个通用的,所以我尝试了类似的东西:

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

尝试用g ++ 4.7编译它会让它尖叫

  

在'&lt;'

之前的预期初始化程序

关于

hash<Thing<T> >

声明的一部分。任何线索都有助于挽救我头上剩下的少量毛发。

1 个答案:

答案 0 :(得分:7)

您无法仅为hash::operator()(const T&)提供专业化服务;只需专注整个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;
        }
    };
}}

另一种方法是为Thing创建一个哈希,并将其指定为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;