私は、オブジェクトのベクトルを持つクラスを持っています。問題のオブジェクトはコピーコンストラクタとコピー代入演算子を削除しているので、ベクトルで使用できるように移動コンストラクタと移動代入演算子があります。オブジェクトを保持するこのクラスは、オブジェクトをバッファからクラスのオブジェクトベクトルに追加するか、クラスのオブジェクトベクトルからバッファに抽出することを可能にするappendメソッドとextractメソッドを持っています。オブジェクトをベクトルAからベクトルBに移動できますが、BからAに移動することはできませんか?
オブジェクト定義は次のようになります。
struct MyObject
{
int width_ = 0;
int height_ = 0;
//etc...
stImage() = default;
stImage(int width, int height, ...)
{
width_ = width;
height_ = height;
//etc...
}
stImage(const stImage& rhs) = delete;
stImage& operator= (const stImage & rhs) = delete;
stImage(stImage&& rhs) : width_(0), height_(0), ...
{
*this = std::move(rhs);
}
stImage& operator=(stImage&& rhs)
{
if (this != &rhs)
{
width_ = rhs.width_;
height_ = rhs.height_;
//etc...
rhs.width_ = 0;
rhs.height_ = 0;
//etc...
}
return *this;
}
};
アペンド方法はコンパイル:
void MyClass::append(MyObject * buffer)
{
data_.push_back(std::move(*buffer));
}
void MyClass::append(Vector<MyObject> * buffer)
{
for (int i = 0; i < (*buffer).size(); i++)
{
data_.push_back(std::move((*buffer)[i]));
}
}
はしかし、抽出方法はない:
void MyClass::extract(it8 start, Length length, Vector<MyObject> * buffer) const
{
for (it8 i = start; i < (start + length); i++)
{
(*buffer).push_back(std::move(data_[i]));
}
}
与えられたエラーがあります」 C2280 'MyObject :: MyObject(const MyObject &)':削除されたfを参照しようとしています
なぜこれらの2つの操作が機能的に異なるのかわかりません。抽出が失敗して追加する理由についての洞察は理解できず、抽出作業を行う方法はさらにそうです。
(注:ベクトルはstd :: vectorのカスタムインプリメンテーションです。理由は同じですが、私が知っている限り、それらは同じ機能を果たします。これが潜在的に問題であり、std :: vectorは問題ありません彼らが立っているので、私はそれを使うのが良いかどうか分かります)。
コンパイラの出力は何ですか? – Aeonos
これは 'const'メソッドからやっていますか?興味深い...メソッドがconstの場合、 'data_'に対して' operator [] 'が選択されます。 – WhozCraig
@Aeonos C2280 'MyObject :: MyObject(const MyObject&)':削除された関数を参照しようとしています – ELRG