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



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

错误1错误C2280:"std::unique_ptr>:"unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>>)':试图引用已删除的功能

查看Stack Overflow,VS 2013中似乎有一个错误,矢量错误地试图复制unique_ptr而不是移动它们,所以我试图将自己的移动函数添加到Deck类中,但仍然收到错误。

以下是所讨论代码的一个最小示例(Card只是一个伪类,其中没有对象):

甲板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
}

关于如何解决这个问题有什么想法吗?我确信我一定错过了一些显而易见的东西,但我已经为此绞尽脑汁,并在谷歌上搜索了相当长的一段时间,我需要一些帮助。

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

将其更改为

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

匿名功能在您的情况下是可能的,而且更好。这将防止具有多个类函数,从而简化整个过程。

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

相关内容

  • 没有找到相关文章

最新更新