我正在尝试创建一个包含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;
};
有关如何解决此问题的任何想法?我敢肯定我一定会错过一些相当明显的东西,但是我一直在反对这一点,现在用谷歌搜索它,并且可以使用一些帮助。
答案 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();
});
}