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

MFC中CArray<int,int&>赋值报错C2280,求解决方法

CArray<int, int&>赋值触发已删除函数错误的解决办法

问题场景

代码示例:

CArray <int, int&> temp;
CArray <int, int&> definition;
    
definition = temp;

编译错误信息(翻译后):

error C2280: 尝试引用已删除的函数 CArray<int,int &> &CArray<int,int &>::operator =(const CArray<int,int &> &)

错误原因

MFC的CArray模板在第二个参数指定为引用类型(此处是int&)时,编译器会自动删除默认的拷贝赋值运算符。这是因为引用本身无法被重新绑定,而CArray的默认拷贝赋值逻辑依赖于对元素的直接赋值操作,这种操作对引用类型无效,因此编译器禁用了该运算符。

解决方案

1. 改用值类型作为模板第二个参数

这是最简单的解决方式,将CArray<int, int&>改为CArray<int, int>,此时默认的拷贝赋值运算符可以正常工作:

CArray<int, int> temp;
CArray<int, int> definition;

definition = temp;

适合不需要通过引用访问数组元素的场景。

2. 自定义拷贝赋值运算符(保留引用类型时)

如果必须使用int&作为模板参数,需要手动实现赋值逻辑。注意:引用本身不能改变指向,因此实际是将源数组元素的值赋值给目标数组引用指向的对象,同时需要手动管理内存避免泄漏:

class MyIntArray : public CArray<int, int&>
{
public:
    MyIntArray& operator=(const MyIntArray& other)
    {
        if (this != &other)
        {
            RemoveAll();
            // 逐个复制元素值,同时为引用分配有效对象
            for (int i = 0; i < other.GetSize(); ++i)
            {
                int* pNewVal = new int(other[i]);
                Add(*pNewVal);
            }
        }
        return *this;
    }

    // 析构函数释放内存
    ~MyIntArray()
    {
        for (int i = 0; i < GetSize(); ++i)
        {
            delete &GetAt(i);
        }
        RemoveAll();
    }
};

使用时替换原来的CArray<int, int&>为MyIntArray即可。

3. 替换为标准库容器

如果项目允许,用std::vector<int>替代CArray是更稳妥的选择,标准库容器对值类型的拷贝赋值支持完善:

#include <vector>

std::vector<int> temp;
std::vector<int> definition;

definition = temp;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:26:08