学习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 尝试引用已删除的函数相关推荐

  1. C++ Error C2280 尝试引用已删除的函数(二)因std::mutex引起的拷贝

    我最近做的项目用到了C++11的多线程库,其中一个类A中有一个类B的成员,而类B的成员中使用到了std::mutex互斥锁,这个互斥锁在B中使用没有任何问题,但是当类B成为一个类A的成员之后,就出现了 ...

  2. 如何解决C++编译错误C2280尝试引用已删除的函数【每天一个小技巧】

    本文结构 0.引言 1.解决方法 0.引言 在使用开源优化库QP时,采用了OSQP-EIGEN的包装器,在我的类中想引用他的求解器 / test.hpp class name{*******OsqpE ...

  3. error:尝试引用已删除的函数或已显式删除函数

    很基础的操作 在重载运算符的时候,尤其是<<和>>运算符重载,我们也许会遇到这个问题,一般情况下就是函数的声明没有写好,如这样的声明: friend std::ostream ...

  4. C2280 “std::_Uhash_compare<_Kty,_Hasher,_Keyeq>......尝试引用已删除的函数

    错误 C2280 "std::_Uhash_compare<_Kty,_Hasher,_Keyeq>::_Uhash_compare(const std::_Uhash_comp ...

  5. C++Error2208:...尝试引用已删除的函数

    C++Error2208:...尝试引用已删除的函数 在用自己编写的类实例化c++stl容器vector时,调用了vector.erase()方法,结果编译器报了以下错误 错误 C2280 " ...

  6. C++Error2208:…尝试引用已删除的函数

    C++Error2208:-尝试引用已删除的函数 在使用自己编写的类实例化c++linklist,结果编译器报了以下错误 错误 C2280 "LList::LList(const LList ...

  7. 尝试引用已删除的函数_学Excel函数公式,你必须要掌握这些知识

    函数与公式是Excel的特色之一,充分展示出其出色的计算能力,灵活使用函数与公式可以极大地提高数据处理分析的能力和效率. 今天我们分享的是函数和公式的定义,虽然都是最基本的知识,但理解并掌握Excel ...

  8. 尝试引用已删除的函数_如何在Excel中使用ROW函数

    一.ROW函数介绍 1. ROW函数是用来得到指定单元格的行号.比如"=ROW(B1)",得到的就是B1的行号为"1". 2. 如果括号里面为空,什么都不引用, ...

  9. C++“(已隐式声明)--它是已删除的函数 ” “尝试引用已删除的函数”知识点MARK

    今天写一个简单的文件处理工具类时遇到了一个新bug,是一个之前忽略掉的知识点,特此mark一下. 错误如下: c++类在初始化的时候有两种方式: 1. M_CLASS m_class(...); 2. ...

最新文章

  1. Linux命令学习手册-arp命令
  2. Jquery string 和 json相互转换的方法
  3. 用c语言实现去bmp图片的背景,菲律宾博牛网-官方网站
  4. leetcode算法题--最小的k个数
  5. 哈佛成功金句25则(看一遍,都会很有收获!)
  6. OpenCV Harris 角点检测子
  7. boost::detail::spinlock_pool相关的测试程序
  8. Ubuntu 12.10中的8个新功能,Quantal Quetzal
  9. HBase原理 – snapshot 快照
  10. js拾遗: replace 替换参数
  11. eclipse配置glassfish、将一个WEB项目部署到glassfigh
  12. 编写Oracle简单的存储过程
  13. 一段看不懂的乱码字符_字符乱码的解读
  14. mac提示“已损坏,无法打开。 您应该将它移到废纸篓“的终极解决方案
  15. python方差齐性检验_方差齐性检验的原理
  16. LVGL misc log日志系统(lv_log.h)
  17. MP4/MP3解封装ffmpeg(十三)
  18. Ubuntu 16.04 中文版安装基础入门教程
  19. python计算平方根算法_每日一程-16.python-巴比伦平方根算法
  20. 【水文模型】SWAT水文模型原理及数据库简介

热门文章

  1. go语言中同一个package下的文件相互引用怎么做?
  2. 升级Android SDK (API24)笔记
  3. 嵌入式作业STM32F103C8T6和stm32CubeMX实现LED灯
  4. 数字联盟可信ID 3.0 正式上线升级 用真实数据助力企业增长
  5. JavaScript实现逆波兰式
  6. leetcode 2203 单源最短路中转
  7. 悬浮窗java_Android悬浮窗示例(floatingwindow)
  8. 电视盒子最新android,安卓盒子已倒下!4款Win10电视盒子推荐
  9. 【转贴】你必须知道的20个故事
  10. FAST角点检测算法(二)- 非极大值抑制筛选fast特征点