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
相关产品推荐
相关产品推荐

