5

我有这个模板类:

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 编译它让它尖叫

'<'</p> 之前的预期初始化程序

有关

hash<Thing<T> >

声明的一部分。任何线索都将有助于挽救我头上剩下的几根头发。

4

1 回答 1

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;
于 2013-05-08T22:34:59.743 回答