在tr1中为模板类定义哈希

时间:2011-01-23 11:25:06

标签: c++

我有班级网关。 我需要将此类的对象存储在哈希表中(使用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<>

当我们使用没有完整定义的类时会发生这种错误,但是在声明之前完全定义了类。我已经在没有模板的情况下以非常类似的方式使用它而没有问题。

1 个答案:

答案 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> &不是嵌套名称空间。