Я пытаюсь установить карту unique_ptr с помощью метода.
class A {
map<int, unique_ptr<B>> x;
public:
void setx(const map<int, unique_ptr<B>>& x) {this->x = x;} // <-- error
...
};
Однако я получил эту ошибку.
'constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int; _T2 = std::unique_ptr<ContextSummary>]' is implicitly deleted because the default definition would be ill-formed:
Что не так с этим заданием?
std::unique_ptr
не подлежит копированию, поэтому вы не можете скопировать std::map
что держит unique_ptrs
, Вы можете переместить его, хотя:
void setx(map<int, unique_ptr<B>> x) {
this->x = std::move(x);
}
Обратите внимание, что для перемещения карты вам не нужно const
ссылка, в противном случае вы не можете переместить его. Принятие этого значения позволяет вызывающему использовать либо временные значения, либо перемещенные значения.
Итак, теперь вы будете использовать свой код следующим образом:
std::map<int, std::unique_ptr<B>> some_map = ...;
some_a.setx(std::move(some_map));
Или вот так, используя временные:
some_a.setx({
{1, make_unique<B>(...)},
{2, make_unique<B>(...)}
});
Как указывает 0x499602D2, вы можете сделать это прямо в конструкторе:
A::A(map<int, unique_ptr<B>> x)
: x(std::move(x)) {
}
Других решений пока нет …