Сортировка вектора unique_ptr в VS 2013

Я пытаюсь сделать Deck класс, который содержит вектор unique_ptr<Card>, но попытка отсортировать вектор приводит к этой ошибке:

Ошибка 1 ошибка C2280: ‘std :: unique_ptr> ::
unique_ptr (const std :: unique_ptr<_Ty, станд :: default_delete<_Ty >> &)»
: попытка сослаться на удаленную функцию

Просматривая переполнение стека, кажется, что в VS 2013 есть ошибка, из-за которой векторы некорректно пытаются скопировать unique_ptrs вместо того, чтобы перемещать их, поэтому я попытался добавить свою собственную функцию перемещения в свой Deck класс, но я все еще получаю ошибку.

Вот минимальный пример кода, о котором идет речь (Card это просто фиктивный класс, в котором нет объектов):

deck.h:

#include "Card.h"#include <vector>
#include <memory>

class Deck
{
public:
typedef std::unique_ptr<Card> cardPtr;

Deck();

Deck(Deck && other)
: mDeck(std::move(other.mDeck))
{
}

Deck& operator=(Deck other)
{
swap(*this, other);
return *this;
}

friend void swap(Deck& lhs, Deck& rhs);

void                                sortDeck();

private:
static bool                         compareCards(cardPtr A, cardPtr B);

private:
std::vector<cardPtr>                mDeck;
};

Deck.cpp:

#include "Deck.h"#include <algorithm>Deck::Deck()
{
}

void swap(Deck& lhs, Deck& rhs)
{
using std::swap;
swap(lhs.mDeck, rhs.mDeck);
}bool Deck::compareCards(cardPtr A, cardPtr B)
{
return true; //dummy- normally would have logic here
}

void Deck::sortDeck()
{
std::sort(mDeck.begin(), mDeck.end(), compareCards); //bug happens here
}

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

1

Решение

Ваш compareCards функция принимает unique_ptrs по значению, это не будет работать, так как они не могут быть скопированы ( unique_ptr Конструктор копирования неявно удаляется из-за наличия конструкторов перемещения, копируемых unique_ptr не был бы очень уникальным, не так ли?)

Измените это на

bool compareCards(cardPtr const& A, cardPtr const& B);

5

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

Анонимная функция возможна и лучше в вашей ситуации. Это предотвратит использование нескольких функций класса, что облегчит все.

void sortUniquePtrObjects()
{
std::sort(array.begin(), array.end(),
[&](const std::uniquePtr<ObjectName> &A, const std::uniquePtr<ObjectName> &B)
{
return A->comparableItem() == B->comparableItem();
});
}
0

По вопросам рекламы [email protected]