9

これは有効なC++ですか(最新の標準を考慮)?Ubuntu12.04でツリーの最上位のclang/libc++でコンパイルエラーが発生します。有効な場合は、エラーメッセージなどを記載したclang-devリストをメールで送信します。

#include <functional>
#include <unordered_set>

struct X
{
    int i; 
};

void f ()
{
    std::unordered_set<std::reference_wrapper<X>> setOfReferencesToX;

    // Do stuff with setOfReferencesToX
}

**余談ですが、質問/回答が最新の標準に固有であるという資格を得るのにうんざりしています。C ++コミュニティ全体として、代わりに古い標準に固有のものの認定を開始してください。新しい規格は約1年前から出ています。

4

1 に答える 1

9

問題は、に固有のものstd::reference_wrapper<T>ではなく、タイプX自体に固有のものです。

問題は、std :: unordered_setでは、のハッシュ関数と等価関数を定義する必要があるということですstd::reference_wrapper<X>。ハッシュファンクターを2番目のテンプレートパラメーターとして渡すことができます。

たとえば、これは機能します。

#include <functional> // for std::hash<int>

struct HashX {
  size_t operator()(const X& x) const {
    return std::hash<int>()(x.i);      
  }
};

その後

std::unordered_set<std::reference_wrapper<X>, HashX> setOfReferencesToX;

別のオプションは、以下の専門分野を作成することですstd::hash<X>

namespace std {
template <>
struct hash<X> {
  size_t operator()(const X& x) const {
    return std::hash<int>()(x.i);      
  }
};
}

これにより、2番目のテンプレート引数を明示的に指定することを回避できます。

std::unordered_set<std::reference_wrapper<X>> setOfReferencesToX;

等式の比較に関しては、クラスに等式演算子を指定することでこれを修正できますX

struct X
{
  bool operator==(const X& rhs) const { return i == rhs.i; }
  int i; 
};

それ以外の場合は、独自のファンクターを定義して、それを3番目のテンプレート引数として渡すことができます。

于 2012-08-11T16:02:36.137 に答える