4

Outerプライベート メンバー クラス ( ) を持つクラス ( と呼びます) がありInnerます。のインスタンスをOuter::Inner順不同の標準コンテナに格納したいので、特化したいstd::hash<Outer::Inner>

ただし、これを書くとき:

namespace std {
    template<>
    struct hash<Outer::Inner> {
        std::size_t operator()(const Outer::Inner &arg) const
        {
            return std::hash<int>()(arg.someSpecialProperty);
        }
    };
}

コンパイラは文句を言います:

error: 'Inner' is a private member of 'Outer'
            std::size_t operator()(const Outer::Inner &p) const
                                                ^

この回答std::hashに従ってフレンド構造体を作成しようとしましたが、それも機能しませんでした: の前方宣言が失敗しました:Outer::Inner

error: use of undeclared identifier 'Outer'

では、どのように進めればよいでしょうか (私が意図したことがまったく可能である場合)?

4

2 に答える 2

8

とった !解決策は、std::hash を特殊化するのではなく、独自のファンクターを使用することです。

struct A
{
  A() { v.insert(std::make_pair(B(1), 6)); }

private:
  struct B
  {
    B(int i = 0) : m_i(i) { }

    int m_i;
  };

  struct HashB { std::size_t operator()(const B& b) const { return b.m_i; } };
  struct EqualB { bool operator()(const B&b1, const B&b2) const { return b1.m_i == b2.m_i; } };


  std::unordered_map<B, int, HashB, EqualB> v;
};
于 2014-04-20T22:07:43.167 に答える
5

プライベートな内部型なので、外側のクラスにprivateorメンバーがあると仮定します。protected std::unordered_mapその場合は、プライベート内部ハッシュ ファンクターを記述し、. の 3 番目の引数として渡しますstd::unordered_map。それはあなたの問題に対する最も簡単な解決策だと思います。

于 2014-04-20T22:07:32.967 に答える