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();
记得改成员为指针,然后注意释放,就完活儿了
解决问题!
记之备忘
C++ Error C2280 尝试引用已删除的函数相关推荐
- C++ Error C2280 尝试引用已删除的函数(二)因std::mutex引起的拷贝
我最近做的项目用到了C++11的多线程库,其中一个类A中有一个类B的成员,而类B的成员中使用到了std::mutex互斥锁,这个互斥锁在B中使用没有任何问题,但是当类B成为一个类A的成员之后,就出现了 ...
- 如何解决C++编译错误C2280尝试引用已删除的函数【每天一个小技巧】
本文结构 0.引言 1.解决方法 0.引言 在使用开源优化库QP时,采用了OSQP-EIGEN的包装器,在我的类中想引用他的求解器 / test.hpp class name{*******OsqpE ...
- error:尝试引用已删除的函数或已显式删除函数
很基础的操作 在重载运算符的时候,尤其是<<和>>运算符重载,我们也许会遇到这个问题,一般情况下就是函数的声明没有写好,如这样的声明: friend std::ostream ...
- C2280 “std::_Uhash_compare<_Kty,_Hasher,_Keyeq>......尝试引用已删除的函数
错误 C2280 "std::_Uhash_compare<_Kty,_Hasher,_Keyeq>::_Uhash_compare(const std::_Uhash_comp ...
- C++Error2208:...尝试引用已删除的函数
C++Error2208:...尝试引用已删除的函数 在用自己编写的类实例化c++stl容器vector时,调用了vector.erase()方法,结果编译器报了以下错误 错误 C2280 " ...
- C++Error2208:…尝试引用已删除的函数
C++Error2208:-尝试引用已删除的函数 在使用自己编写的类实例化c++linklist,结果编译器报了以下错误 错误 C2280 "LList::LList(const LList ...
- 尝试引用已删除的函数_学Excel函数公式,你必须要掌握这些知识
函数与公式是Excel的特色之一,充分展示出其出色的计算能力,灵活使用函数与公式可以极大地提高数据处理分析的能力和效率. 今天我们分享的是函数和公式的定义,虽然都是最基本的知识,但理解并掌握Excel ...
- 尝试引用已删除的函数_如何在Excel中使用ROW函数
一.ROW函数介绍 1. ROW函数是用来得到指定单元格的行号.比如"=ROW(B1)",得到的就是B1的行号为"1". 2. 如果括号里面为空,什么都不引用, ...
- C++“(已隐式声明)--它是已删除的函数 ” “尝试引用已删除的函数”知识点MARK
今天写一个简单的文件处理工具类时遇到了一个新bug,是一个之前忽略掉的知识点,特此mark一下. 错误如下: c++类在初始化的时候有两种方式: 1. M_CLASS m_class(...); 2. ...
最新文章
- Linux命令学习手册-arp命令
- Jquery string 和 json相互转换的方法
- 用c语言实现去bmp图片的背景,菲律宾博牛网-官方网站
- leetcode算法题--最小的k个数
- 哈佛成功金句25则(看一遍,都会很有收获!)
- OpenCV Harris 角点检测子
- boost::detail::spinlock_pool相关的测试程序
- Ubuntu 12.10中的8个新功能,Quantal Quetzal
- HBase原理 – snapshot 快照
- js拾遗: replace 替换参数
- eclipse配置glassfish、将一个WEB项目部署到glassfigh
- 编写Oracle简单的存储过程
- 一段看不懂的乱码字符_字符乱码的解读
- mac提示“已损坏,无法打开。 您应该将它移到废纸篓“的终极解决方案
- python方差齐性检验_方差齐性检验的原理
- LVGL misc log日志系统(lv_log.h)
- MP4/MP3解封装ffmpeg(十三)
- Ubuntu 16.04 中文版安装基础入门教程
- python计算平方根算法_每日一程-16.python-巴比伦平方根算法
- 【水文模型】SWAT水文模型原理及数据库简介
热门文章
- go语言中同一个package下的文件相互引用怎么做?
- 升级Android SDK (API24)笔记
- 嵌入式作业STM32F103C8T6和stm32CubeMX实现LED灯
- 数字联盟可信ID 3.0 正式上线升级 用真实数据助力企业增长
- JavaScript实现逆波兰式
- leetcode 2203 单源最短路中转
- 悬浮窗java_Android悬浮窗示例(floatingwindow)
- 电视盒子最新android,安卓盒子已倒下!4款Win10电视盒子推荐
- 【转贴】你必须知道的20个故事
- FAST角点检测算法(二)- 非极大值抑制筛选fast特征点