18

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

根据 c++ 参考,我可以这样做

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.

但它说 Incomplete type ... in nested name specifier ...

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

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

4

2 回答 2

23

试试这个:

class C;
namespace std {
  template<>
  struct hash<C> {
  public:
    size_t operator()(const C &c) const; // don't define yet
  };
}
class C{
  //...
  friend size_t 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
};

(我还没有编译,所以可能有语法错误)

于 2012-12-15T08:58:09.813 回答
-2

我建议添加如下方法

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

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

于 2013-01-11T19:41:37.100 回答