You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++使用unique_ptr作为set函数参数报错C2280怎么解决?

C++ unique_ptr C2280报错修复方案

报错根因

std::unique_ptr是独占所有权的智能指针,C++标准显式删除了它的拷贝构造、拷贝赋值运算符,禁止复制unique_ptr实例,仅支持通过移动语义转移所有权。你收到的报错正是因为代码中尝试调用被删除的unique_ptr拷贝构造函数导致的。

问题代码位置

错误出现在类A的setA成员函数中:

void setA(std::vector<std::unique_ptr<int>> vec) {
    for (int i = 0; i < vec.size(); i++) {
        vecvec.push_back(vec.at(i)); // 此处尝试拷贝unique_ptr,触发报错
    }
}

vec.at(i)返回unique_ptr的左值引用,直接传入push_back会触发拷贝逻辑,虽然你调用setA时已经通过std::move(vec)把外层vec的所有权转移给了形参vec,但往成员变量vecvec插入元素时依然做了非法的拷贝操作。

修复方法

方法1:逐个移动元素

修改push_back逻辑,把vec中元素的所有权转移到成员变量中:

void setA(std::vector<std::unique_ptr<int>> vec) {
    for (int i = 0; i < vec.size(); i++) {
        vecvec.push_back(std::move(vec.at(i)));
    }
}

方法2:直接转移整个vector所有权(更简洁高效)

不需要循环逐个移动,直接把整个vec的所有权转移给成员变量vecvec:

void setA(std::vector<std::unique_ptr<int>> vec) {
    vecvec = std::move(vec);
}

额外注意

你当前代码中类A的默认构造函数仅声明未定义,编译会触发链接错误,补充空实现即可:

class A {
// ...其余代码不变
public:
    A() = default; // 补全默认构造函数
// ...其余代码不变
};

内容的提问来源于stack exchange,提问作者wdafoe666

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 23:36:03