Попытка сослаться на удаленную функцию при обмене приоритетными очередями

Я просто пытался обменять данные между двумя приоритетными очередями и получил эту ошибку. Я также немного погуглил и до сих пор не знаю, что здесь не так.

#include <queue>

class Node
{
public:
int idx;
};
auto greater = []( const Node& a, const Node&  b) {return a.idx > b.idx; };
using QUEUE  = std::priority_queue<Node, std::vector<Node>, decltype(greater)>;

void foo(QUEUE& a)
{
QUEUE b(greater);
a.swap(b);
}

int main()
{

}

Вот полное сообщение об ошибке:

Ошибка C2280 ‘ < lambda_07efac20ebfa61cc8bb35aebd7d81f7c> &<<
lambda_07efac20ebfa61cc8bb35aebd7d81f7c >> :: operator = (const <<
lambda_07efac20ebfa61cc8bb35aebd7d81f7c >> &) ‘: пытаюсь ссылаться
удаленная функция

0

Решение

Реализация std::swap в stdlibc ++ (и, скорее всего, стандартной библиотеке для Visual Studio) используются старомодные назначения:

swap(_Tp& __a, _Tp& __b)
{
// concept requirements
__glibcxx_function_requires(_SGIAssignableConcept<_Tp>)

_Tp __tmp = __a;
__a = __b;
__b = __tmp;
}

Наоборот, libcxx реализует это, используя std::move:

swap(_Tp& __x, _Tp& __y) _NOEXCEPT_(is_nothrow_move_constructible<_Tp>::value &&
is_nothrow_move_assignable<_Tp>::value)
{
_Tp __t(_VSTD::move(__x));
__x = _VSTD::move(__y);
__y = _VSTD::move(__t);
}

Чтобы поменять местами объекты типа std::priority_queue Вы должны поменять местами их компараторы, которые представлены как лямбда в вашем коде. Поменять лямбду в stdlibc ++ невозможно из-за оператора присвоения удаленной копии.

Кстати, нет необходимости использовать лямбду, так как ваш список захвата пуст. Простая функция сделает работу.

bool greater(const Node& a, const Node&  b) {return a.idx > b.idx;};
using QUEUE = std::priority_queue<Node, std::vector<Node>, decltype(&greater)>;

void foo(QUEUE&& a)
{
QUEUE b(&greater);
a.swap(b);
}

В качестве альтернативы вы можете заменить лямбду вызываемым объектом, которому назначено перемещение.

1

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

Лямбды не имеют операторов присваивания, а swap () использует присваивание. Он будет пытаться использовать присваивание для большей лямбды, содержащейся в очереди.

2

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