4

boost::container::flat_setのドロップイン置換である(false?)印象の下で、要素の数が少なく、検索パフォーマンスが挿入よりも重要であると予想される場所にstd::set置き換えましsetた。flat_set

後の段階で、私は紛らわしいコンパイルエラーに困惑しました。それは最終的にflat_setクラスメンバーとしての使用にたどり着きました。

例えば:

class Room {
  private:
    boost::container::flat_set<int> v;
};

flat_set次のコードはコンパイルされませんが、。に置き換えると問題なく動作しstd::setます。

Room a;
Room b = Room(); // Example 1. Compiles OK
a = b;           // Example 2. Compiles OK
a = Room();      // Example 3. Eeeek! Compile fails on this line

私が見るコンパイルエラーは次のとおりです。

エラー:「a = Room()」の「operator=」に一致しません
注:候補者は:
注:Room&Room :: operator =(Room&)
注:「Room」から「Room&」への引数1の既知の変換はありません

私の質問は次のとおりです。

  1. このエラーは予想されますか?もしそうなら、どうすればそれを回避できますか?
  2. サンプルコードの3つのステートメントはどのように異なり、最後の1つだけが失敗するのはなぜですか?
  3. なぜコンパイラはではRoomなくの代入演算子について文句を言うのflat_setですか?の使用はflat_set、クラスに対して生成されたデフォルトの演算子に影響を与えましたか?

完全なサンプルプログラム:

#include <boost/container/flat_set.hpp>

class Room {
  private:
    boost::container::flat_set<int> v;
};

int main(int argc, char *argv[]) {
  Room a;

  Room b = Room();
  a = b;
  a = Room();  // compilation fails here

  return 0;
};
4

2 に答える 2

3

これは、 Boost.Moveによって実行される移動エミュレーションの既知の制限です。詳細については、http ://www.boost.org/doc/libs/1_52_0/doc/html/move/emulation_limitations.html#move.emulation_limitations.assignment_operatorをご覧ください。

于 2012-11-13T16:24:07.057 に答える
1

免責事項:私はOPです。最終的な解決策につながったK-balloの回答を受け入れました。このスレッドを補足するために、これを投稿します。

受け入れられた回答で述べたように、これは実際、BOOST_COPYABLE_AND_MOVABLEマクロを使用するクラスの既知の制限です(これは、およびを含む多くのクラスに適用されます)。boost::containerflat_setflat_map

これを克服するために、const参照引数を取るクラスの代入演算子を定義しました。たとえばRoom、クエシトンのサンプルクラスの場合、次のようになります。

class Room {
  private:
    boost::container::flat_set<int> v;

  public:
    Room& operator=(const Room& source) {
      v = source.v;
      return *this;
    }
};
于 2012-12-14T16:22:32.860 に答える