在QVector <std :: unique_ptr <type >>

时间:2018-10-26 09:59:05

标签: c++ qt

代码

以下是我遇到问题的类的缩小实现:

class Dummy{
public:
    Dummy();
    ~Dummy();
    void addItem(std::unique_ptr<Type>&& item);
private:
    QVector<std::unique_ptr<Type>> collection;
}

上面的代码片段中的Type是另一个支持移动语义的类。 这是addItem成员的实现:

void Dummy::addItem(std::unique_ptr<Type>&& item){
    if((std::find(collection.begin(), collection.end(), item) == colection.end()){
        collection.push_back(std::move(item));
    }
}

我使用类Dummy如下:

Dummy myDummy;
std::unique_ptr<Type> item(new Type());
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<std::unique_ptr<Type>>上迭代提供的迭代器,因此无法使用算法标头提供的std::find
我可以为for(auto const& other : collection)使用range-base并为Type实现相等运算符,以便从std::find获得行为。
我无法理解该示例在哪里出错。

1 个答案:

答案 0 :(得分:1)

问题是QVector在您执行以下操作时会复制(复制构造)其元素:

  • 使用push_back()函数添加它们。
  • 获取非恒定迭代器到容器的末端。

要避免第二个,您必须使用相当常量的迭代器,即QVector::constBegin()QVector::constEnd(),即

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

为避免在添加时复制... hm,我建议改用std::vector