我试图创建一个包含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();
});
}