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の既知の変換はありません
私の質問は次のとおりです。
- このエラーは予想されますか?もしそうなら、どうすればそれを回避できますか?
- サンプルコードの3つのステートメントはどのように異なり、最後の1つだけが失敗するのはなぜですか?
- なぜコンパイラはでは
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;
};