Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::在QVector上查找<;标准::唯一性\u ptr<;类型>&燃气轮机; 代码_C++_Qt - Fatal编程技术网

C++ 使用std::在QVector上查找<;标准::唯一性\u ptr<;类型>&燃气轮机; 代码

C++ 使用std::在QVector上查找<;标准::唯一性\u ptr<;类型>&燃气轮机; 代码,c++,qt,C++,Qt,下面是我遇到问题的一个类的缩小实现: class Dummy{ public: Dummy(); ~Dummy(); void addItem(std::unique_ptr<Type>&& item); private: QVector<std::unique_ptr<Type>> collection; } 我使用类Dummy,如下所示: Dummy myDummy; std::unique_ptr<

下面是我遇到问题的一个类的缩小实现:

class Dummy{
public:
    Dummy();
    ~Dummy();
    void addItem(std::unique_ptr<Type>&& item);
private:
    QVector<std::unique_ptr<Type>> collection;
}
我使用类
Dummy
,如下所示:

Dummy myDummy;
std::unique_ptr<Type> item(new Type());
myDummy.addItem(sdt::move(item));
Dummy-myDummy;
std::唯一的ptr项(新类型());
myDummy.addItem(sdt::move(item));
问题 编译器报告以下内容:

required from 'QVector<T>::iterator QVector<T>::begin()'
required from here
use of deleted function 'std::unique_ptr<_Tp,_Dp>::unique_ptr(const std::unique_ptr<_Tp,_Dp>&)'
'QVector::iterator QVector::begin()'中需要

从这里开始需要
已删除函数“std::unique\u ptr::unique\u ptr(const std::unique\u ptr&)”的使用
这是否意味着我无法使用提供的迭代器在
QVector
上进行迭代,因此无法使用算法头提供的
std::find
我可以为(auto const&other:collection)使用
for的范围基,并为
Type
实现相等运算符,以便从
std::find


我没能理解这个例子哪里出了问题

问题在于
QVector
在以下情况下复制(复制构造)其元素:

  • 使用
    push_back()
    函数添加它们
  • 获取容器末尾的非常量迭代器
为了避免第二个问题,您必须使用常量迭代器,即
QVector::constBegin()
QVector::constEnd()
,即

if (std::find(collection.constBegin(), collection.constEnd(), item) == collection.constEnd()) {...}

为避免添加时复制。。。嗯,我建议改用
std::vector

你永远不会在
集合中找到一个
唯一的\u ptr
等于
项的,因为它们都是唯一的。您应该寻找一个
unique\ptr
,它拥有一个
类型
,该类型等于
集合
内容所拥有的类型,请使用合适的unaryPredicate尝试
std::find_if
。该问题是由于尝试执行唯一指针元素的副本而引起的。你必须避免它。@vahancho说得对,但具体在哪里?调用
collection.begin()
时,损坏已经发生。错误的原因似乎发生在调用之前。@Caleth谢谢,如果
std::find
而不是
std::find
,那么使用
std::find\u是有意义的。但是它并不能解决编译器的问题。
QVector::iterator
T*
的别名,所以我认为如果
collection.begin()
本身无法编译您是对的,那就有点可疑了。当我分别将迭代器更改为
constBegin()
constEnd()
时,问题从
collection.begin()转移到
collection.push_back(std::move(item))
。这个问题是通过使用
std::vector
而不是
QVector
解决的。我认为使用
QVector
无法解决复制问题,因为它的共享数据范式,当它在写时复制数据时,当您调用
push_back()
时。
if (std::find(collection.constBegin(), collection.constEnd(), item) == collection.constEnd()) {...}