C++ Error C2280 尝试引用已删除的函数

学习C++的右值引用的时候,发现一个错误

1>e:\work\jutiltest\jutiltest\main.cpp(88): error C2280: “MyString::MyString(const MyString &): 尝试引用已删除的函数
1>e:\work\jutiltest\jutiltest\main.cpp(72): note: 编译器已在此处生成“MyString::MyString”
1>e:\work\jutiltest\jutiltest\main.cpp(72): note: “MyString::MyString(const MyString &): 因为“MyString”有一个用户定义的 移动赋值运算符,所以已隐式删除函数

MMP,半小时没搞清楚为什么,最后发现。。。

这种情况的原因是构造函数被C++11编译器的安全考虑下,被删除了,从而找不到构造函数,因而报错。

我重载了一个移动赋值运算符
在这里插入图片描述

那么在C++11的标准中,编译器会自动将默认拷贝构造函数(MyString(MyString& str))删除,以防止出现浅拷贝等不确定行为,等同于MyString(MyString& str) = delete;

此时如果用户不自定义一个拷贝构造函数,那么在拷贝构造对象时,则无法找到构造函数

修复方法:自定义一个拷贝构造函数或者移动构造函数

在这里插入图片描述

于是便解决了问题!

(还有一个其他类似的情况,比如我的某一个类内含有一个ifstram对象,但是我构造时进行了一个赋值,后出发同样的错误)

1>e:\work\jutiltest\jutiltest\main.cpp(19): error C2280: “Jutil::BinaryPrintFile::BinaryPrintFile(const Jutil::BinaryPrintFile &): 尝试引用已删除的函数
1>f:\lib\jutil\jutil.h(45): note: 编译器已在此处生成“Jutil::BinaryPrintFile::BinaryPrintFile”
1>f:\lib\jutil\jutil.h(45): note: “Jutil::BinaryPrintFile::BinaryPrintFile(const Jutil::BinaryPrintFile &): 因为 数据成员 调用已删除或不可访问的函数“std::basic_ifstream<char,std::char_traits<char>>::basic_ifstream(const std::basic_ifstream<char,std::char_traits<char>> &)”,所以已隐式删除函数
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\fstream(944): note: “std::basic_ifstream<char,std::char_traits<char>>::basic_ifstream(const std::basic_ifstream<char,std::char_traits<char>> &): 已显式删除函数

其原因是因为构造函数中的这一句

this->is = std::ifstream();

将一个ifstream拷贝赋值给了类中的成员,查阅ifstream源代码,发现了问题,ifstream中的拷贝构造函数是=delete的(不允许拷贝构造)

可能是IO安全着想…

总之,就是不能拷贝构造了,所以会导致错误

修复方法:算了不拷贝构造了,我直接new吧,改成这样
this->is = new std::ifstream();

记得改成员为指针,然后注意释放,就完活儿了

解决问题!

记之备忘

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值