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;
};