У меня есть класс, который имеет вектор объектов. Объекты, о которых идет речь, удалили конструкторы копирования и операторы присваивания копий, и, следовательно, у них есть конструктор перемещения и оператор перемещения, чтобы они могли использоваться с векторами. Этот класс, который содержит объекты, имеет методы добавления и извлечения, которые позволяют добавлять объекты в вектор объекта объекта из буфера или извлекать из вектора объекта класса в буфер.Может перемещать объект из вектора 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;
}
};
Методы Append компиляции:
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 unction "
Не могу понять, почему эти две операции функционально отличаются друг от друга. Любое понимание того, почему извлечение не удается и добавление, не будет оценено, и способ сделать работу с экстрактом будет еще более.
(Примечание: Вектор здесь представляет собой пользовательскую реализацию std :: vector, поскольку причины, но насколько мне известно, они работают одинаково. Если это потенциально проблема, а std :: vector будет в порядке с добавлением/извлечением, поскольку они стоят, я думаю, я посмотрю, будет ли это использовать.)
Что такое выход компилятора? – Aeonos
Вы делаете это из метода 'const'? Интересно ... Если метод const, то таким образом должен быть выбран 'operator []' для 'data_', не так ли? – WhozCraig
@Aeonos C2280 'MyObject :: MyObject (const MyObject &)': попытка ссылки на удаленную функцию – ELRG