具有唯一指针的设置函数给出错误 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;
当我尝试 运行 下面的代码时,我收到此错误消息:
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;