我有一個有對象向量的類。有問題的對象刪除了複製構造函數和複製賦值運算符,因此它們具有移動構造函數和移動賦值運算符,以允許它們與矢量一起使用。這個持有這些對象的類具有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聯合「
我看不出爲什麼這兩個操作在功能上彼此不同。任何洞察爲什麼提取失敗和追加不會被讚賞,並且提取工作的一種方式將是更加如此。 (注:Vector這裏是std :: vector的自定義實現,因爲Reasons,但據我所知,它們的功能相同。如果這可能是問題,並且std :: vector會很好與追加/提取,因爲他們的立場,我想我會看看如果使用它會好的。)
什麼是編譯器輸出? – Aeonos
你是用'const'方法做這件事的嗎?有趣......如果方法是const,那麼對於'data_',所選的'operator []'應該是這樣嗎? – WhozCraig
@Aeonos C2280'MyObject :: MyObject(const MyObject&)':嘗試引用已刪除的函數 – ELRG