2013-05-08 26 views
4

我有这样的模板类:C++的std :: TR1 ::哈希一个模板类

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

,我想在unordered_set使用它:

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

如今类东西都有它需要的一切除了散列函数。我想就这个通用的,所以我尝试类似:

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

尝试相克编译此++ 4.7有它

预期初始化之前“<”

有关尖叫

hash<Thing<T> > 

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

回答

6

您不能仅为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; 
+0

我相信这是罕见的情况下,您可以在std命名空间中写一个:-) – rwols 2013-05-08 22:49:58

+0

@rwols是的,你被允许特添加到'std'命名空间 – Praetorian 2013-05-08 22:55:55

+0

可悲的是,我只是第二选项将起作用。大概情况是,第一个将在C++ - 11下工作,但我的应用程序必须双向运行。第一个选项会产生与现有的hash- pre-C++-11定义的冲突。非常感谢所有相同的。 – 2013-05-09 16:22:23