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

问题描述 投票:13回答:2

我有一个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,如何解决这种情况呢?

c++ hash c++11 unordered-map
2个回答
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
投票

我建议添加如下方法

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

并在您的哈希专业化中使用它。

© www.soinside.com 2019 - 2024. All rights reserved.