为嵌套的自定义类型定义哈希函数

时间:2015-08-20 03:36:27

标签: c++ templates c++11 hash compiler-errors

给定一个嵌套的模板类结构,如下所示:

template<class T> class A
{
  ...
public:
  ...
  class B;
};

我希望std :: hash函数能够处理嵌套类,以便可以将它放在unsorted_map和unsorted_set之类的内容中,所以我将嵌套类定义为:

template<class T> class A<T>::B 
{
  public:
    bool operator==(const A<T>::B &) const;
  ...
  friend struct std::hash<A<T>::B>;
};

然后尝试为此类型添加专门的std :: hash结构,如下所示:

namespace std
{
  template<class T> struct hash<A<T>::B>
  {
    bool operator()(const A<T>::B &x) const
    {
       ...
    }
  };
}

但是当我尝试像这样定义自定义std :: hash函数对象时,编译器会激动地抱怨。

我收到的错误消息无益,如下所示:

xyz.cc:17:38: error: type/value mismatch at argument 1 in template parameter list for 'template<class _Tp> struct std::hash'
 template<class T> struct hash<A<T>::B>
                                      ^
xyz.cc:17:38: error:   expected a type, got 'A<T>::B'

然而,我不确定我应该怎么表达它。

为什么这是错的,我该怎么做才能解决它?

1 个答案:

答案 0 :(得分:1)

你不能。

依赖类型不能与模式匹配,因为一般情况下需要反转任意图灵完备算法。

最简单的方法是将B设为独立模板,然后将typedef设置为A