具有唯一指针的设置函数给出错误 c2280

set function with unique pointer is giving error c2280

当我尝试 运行 下面的代码时,我收到此错误消息:

Error C2280 'std::unique_ptr<int,std::default_delete<int>>::unique_ptr(const std::unique_ptr<int,std::default_delete<int>> &)': attempting to reference a deleted function

如何解决这个错误?

#include <memory>
#include <vector>
#include<iostream>

class A {
private:
    std::vector<std::unique_ptr<int>> vecvec;
public:
    A();
    void setA(std::vector<std::unique_ptr<int>> vec) {
        for (int i = 0; i < vec.size(); i++) {
            vecvec.push_back(vec.at(i));
        }
    }
    void printInfo() {
        for (int i = 0; i < vecvec.size(); i++) {
            std::cout << *vecvec.at(i) << std::endl;
        }
    }
};
int main()
{
    A example;

    std::vector<std::unique_ptr<int>> vec;


    std::unique_ptr<int> ptrA1 = std::make_unique<int>(5);
    std::unique_ptr<int>ptrA2 = std::make_unique<int>(6);


    vec.push_back(std::move(ptrA1));
    vec.push_back(std::move(ptrA2));

    for (int i = 0; i < vec.size(); i++) {
        std::cout << *vec.at(i) << std::endl;
    }


    example.setA(std::move(vec));
    example.printInfo();

    return 0;
}

更改此行很容易修复:

vecvec.push_back(std::move(vec.at(i)));

您需要移动 unique_ptr 而不是默认的复制行为,unique_ptr 只能移动但不可复制。对于shared_ptr,它是可复制和移动的,所以如果你把它改成shared_ptr就可以了。

对了,你忘记添加构造函数定义了:

A() = default;

Online demo