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

set function with unique pointer is giving error c2280

本文关键字:出错 错误 c2280 函数 set 唯一 指针      更新时间:2024-09-28

当我尝试运行以下代码时,我收到了以下错误消息:

错误C2280'std::unique_ptr<int,std::default_delete<int>gt;:unique_ptr(const std::unique_ptr<int,std::default_delete<int>>(':试图引用已删除的函数

如何修复此错误?

#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;

在线演示

相关文章: