我有一个有对象向量的类。有问题的对象删除了复制构造函数和复制赋值运算符,因此它们具有移动构造函数和移动赋值运算符,以允许它们与矢量一起使用。这个持有这些对象的类具有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