我有班级网关。
我需要将此类的对象存储在哈希表中(使用tr1 :: unordered_set)。
我在另一个上下文中使用了unorderd_set和类Gateway,它们工作正常,但我无法弄清楚如何将网关放在无序集中,因为我无法在tr1的命名空间中定义它的hash
函数
我尝试过:(以及许多其他变体)
namespace std {
namespace tr1 {
template<> <typename T> inline size_t hash<(typename Gateway<T>)>::operator()(Gateway<T> gT) const {
return gT.getCore()->hash(); //!DOESN't WORK
}
}
编译器说这个(typename Gateway<T>
)是错误的。如果我关闭()
,则假定>>
末尾的hash<typename Gateway<T>>()
是输出流。
虽然过去我已经完成了这个
namespace std {
namespace tr1 {
template<> inline size_t hash<Board>::operator()(Board b) const {
return b.hash(); //!WORKS FINE
}
}
}
有人能解释一下这个问题吗?
更新
感谢您的回答,但仍有问题编译器说无效使用不完整类型struct std::tr1::hash<>
当我们使用没有完整定义的类时会发生这种错误,但是在声明之前完全定义了类。我已经在没有模板的情况下以非常类似的方式使用它而没有问题。
答案 0 :(得分:2)
template <typename T>
inline size_t hash<(typename Gateway<T>)>::operator()(Gateway<T> gT) const
语法错误。 <{1}}不是必需的。
正确的语法是:
typename
注意我也做了参数namespace tr1
{
template <typename T>
inline size_t hash<Gateway<T> >::operator()(const Gateway<T> & gT) const
{
return gT.getCore()->hash();
}
}
类型,只是为了避免复制!
另请注意,名称空间const Gateway<T> &
不是嵌套名称空间。