在VS 2013中对unique_ptr的向量进行排序

时间:2014-09-08 01:22:32

标签: c++ vector visual-studio-2013 unique-ptr playing-cards

我正在尝试创建一个包含Deck向量的unique_ptr<Card>类,但尝试对向量进行排序会导致此错误:

  

错误1错误C2280:'std :: unique_ptr&gt; ::       unique_ptr(const std :: unique_ptr&lt; _Ty,std :: default_delete&lt; _Ty&gt;&gt;&amp;)'       :尝试引用已删除的函数

通过Stack Overflow,看起来VS 2013中有一个错误,其中向量错误地尝试复制unique_ptr而不是移动它们,因此我尝试将自己的移动函数添加到{{1} } class,但我仍然得到错误。

以下是相关代码的最小示例(Deck只是一个虚拟类,其中没有对象):

加入deck.h:

Card

Deck.cpp:

#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;
};

有关如何解决此问题的任何想法?我敢肯定我一定会错过一些相当明显的东西,但是我一直在反对这一点,现在用谷歌搜索它,并且可以使用一些帮助。

2 个答案:

答案 0 :(得分:5)

您的compareCards函数按值unique_ptr获取,这不起作用,因为它们不可复制(由于存在移动构造函数,隐式删除了unique_ptr复制构造函数,可复制的unique_ptr不是很独特吗?)。

将其更改为

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

答案 1 :(得分:0)

匿名功能可以在您的情况下更好。这将阻止具有多个类功能,从而促进整个事物。

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