18

string* psプライベート データ メンバーを持つクラス C があります。
ここで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.

しかし、不完全な型...ネストされた名前指定子で...

クラス 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 に答える