用户定义类的哈希函数。如何交朋友? :)

时间:2012-12-15 08:49:33

标签: c++ hash c++11 unordered-map

我有一个C类,它有一个string* ps私有数据成员 现在,我想要一个unordered_map<C, int>,我需要一个自定义哈希函数。

According to the c++ reference,我可以这样做

namespace std {
  template<>
  class hash<C> {
  public:
    size_t operator()(const C &c) const
    {
      return std::hash<std::string>()(*c.ps);
    }
  };
}

问题是,我似乎无法与operator()C朋友建立联系,以便我可以访问ps

我试过这个:

class C;
template<>
class std::hash<C>;
class C{
  //...
  friend std::hash<C>::operator ()(const C&) const; // error: Incomplete type 
};
// define hash<C> here.

但它表示嵌套名称说明符中的不完整类型...

我也无法扭转定义,因为如果稍后定义C类,hash<C>无法了解ps

我在这里做错了什么?如何在不公开ps的情况下解决这种情况?

2 个答案:

答案 0 :(得分:17)

试试这个:

class C;
namespace std {
  template<>
  struct hash<C> {
  public:
    size_t operator()(const C &c) const; // don't define yet
  };
}
class C{
  //...
  friend std::hash<C>::operator ()(const C&) const;
};
namespace std {
  template<>
  size_t hash<C>::operator()(const C &c) const {
    return std::hash<std::string>()(*c.ps);
  }
}

或者这个:

class C;
template<>
struct std::hash<C>;
class C{
  friend struct std::hash<C>; // friend the class, not the member function
};

(我没有编译,因此可能存在语法错误)

答案 1 :(得分:-1)

我建议添加如下方法

class C
{
....
public:  const string* get_ps() const { return ps; }
....
};

并在哈希特化中使用它。