пара (const std :: pair & lt; _T1, _T2 & gt; & amp;) неявно удаляется, поскольку определение по умолчанию будет неправильно сформировано. Ошибка: при назначении карты unique_ptr

Я пытаюсь установить карту 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:

Что не так с этим заданием?

1

Решение

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)) {

}
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru