Я хотел бы создать структуру, которая имеет несколько примитивных членов и unique_ptr, который не может быть скопирован.Я попытался решить эту проблему, отключив копирование и добавив конструктор перемещения по умолчанию, но он не работает.Компилятор пытается найти конструктор с двумя аргументами, но его нет:
In function 'int main()':
37:3: error: no matching function for call to 'ListElem::ListElem(<brace-enclosed initializer list>)'
37:3: note: candidates are:
25:2: note: ListElem::ListElem(ListElem&&)
25:2: note: candidate expects 1 argument, 2 provided
20:5: note: constexpr ListElem::ListElem()
20:5: note: candidate expects 0 arguments, 2 provided
Код:
// Example program
#include <iostream>
#include <memory>
#include <vector>
class MyObj {
public:
virtual ~MyObj(){}
};
class MyObj2 : public MyObj{
public:
virtual ~MyObj2(){}
};
struct ListElem {
std::unique_ptr<MyObj> item;
int some_counter = 0;
ListElem() = default;
ListElem(ListElem const& e) = delete;
ListElem& operator=(ListElem const& e) = delete;
ListElem(ListElem&& e) = default;
ListElem& operator=(ListElem&& e) = default;
};
int main()
{
std::vector<ListElem> elems;
ListElem item{
std::unique_ptr<MyObj>(new MyObj2()),
10
};
elems.push_back(std::move(item));
}
Как я могу решить эту ошибку?
Редактировать
Я изменил конструктор на это:
ListElem(std::unique_ptr<MyObj>&& _item, int _some_counter): item(_item), some_counter(_some_counter) {}
Но теперь я получаю error: use of deleted function