VS2019编译C++代码报错C2280:尝试引用已删除函数如何解决?
错误根因
- C++ 类中存在未初始化的
const非静态成员时,编译器不会自动生成默认无参构造函数,会将其标记为已删除函数。你的Matrix类内定义了const size_t N;,没有给定初始值,也没有显式定义构造函数初始化该变量,因此默认构造函数不可用,调用Matrix f;时就会触发C2280报错。
之前可以正常运行的原因大概率是你之前的代码中还没有加入这个N成员变量。
修复方案
可以根据你的实际需求选任意一种:
- 如果你根本不需要用到
N这个成员变量,直接删除const size_t N;这行代码即可,编译器会自动生成可用的默认无参构造函数,编译直接通过。 - 如果你需要保留
N作为固定值的常量,直接给它加类内初始值:
// 修改matrix.h中的N定义 const size_t N = 0; // 替换成你需要的固定值即可
- 如果你需要在创建
Matrix对象时动态指定N的值,就显式声明默认构造函数,在初始化列表中完成N的初始化:
class Matrix { public: const size_t N; // 新增显式默认构造函数 Matrix() : N(0) {} // 括号内可以自定义N的初始值 // 剩下的原有代码不变 };
额外注意事项
你当前调用create(10, 1, {3, 4, 5, 6, 7, 8, 9})时,传入的vector长度只有7,和10*1=10的长度要求不匹配,运行时会触发你写的错误分支输出bello,如果需要正常初始化矩阵要补全3个元素。
内容的提问来源于stack exchange,提问作者BaagadBilla
相关产品推荐
相关产品推荐

