一个模板类的 C++ std::tr1::hash

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编译此代码时,会出现以下错误:

在‘<’之前缺少预期的初始化程序

关于此问题:

hash<Thing<T> >

这是声明的一部分。任何线索都有助于保留我头上仅剩的几根头发。

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;

我相信这是一个罕见的情况,您可以在std命名空间内编写代码 :-) - rwols
@rwols 是的,您可以将专业知识添加到 std 命名空间中。 - Praetorian
很遗憾,对我来说只有第二个选项可行。也许在C++-11下第一个选项可以工作,但我的应用程序必须双向兼容。第一个选项会与先前的hash<T>定义产生冲突,这是在C++-11之前的版本中存在的。非常感谢。 - Roger March

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接