我有这个模板类:
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> >
声明的一部分。任何线索都有助于挽救我头上剩下的少量毛发。
答案 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;