C++ Error C2280 尝试引用已删除的函数(二)因std::mutex引起的拷贝
我最近做的项目用到了C++11的多线程库,其中一个类A中有一个类B的成员,而类B的成员中使用到了std::mutex互斥锁,这个互斥锁在B中使用没有任何问题,但是当类B成为一个类A的成员之后,就出现了问题,
1>e:\workqt\spotdetect\detectviewer.cpp(5): error C2280: “Detector::Detector(const Detector &)”: 尝试引用已删除的函数
1>e:\workqt\spotdetect\detector.h(97): note: 编译器已在此处生成“Detector::Detector”
1>e:\workqt\spotdetect\detector.h(97): note: “Detector::Detector(const Detector &)”: 因为 数据成员 调用已删除或不可访问的函数“std::mutex::mutex(const std::mutex &)”,所以已隐式删除函数 (编译源文件 detectviewer.cpp)
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\mutex(91): note: “std::mutex::mutex(const std::mutex &)”: 已显式删除函数 (编译源文件 detectviewer.cpp)
对这个问题一度很迷茫,最后查了半天,是因为包含关系导致的,类A中有一个类B的成员,类B中有一个互斥锁,而查看std::mutex源代码,mutex的拷贝构造函数是被delete的,不允许拷贝构造,然而在类A的构造函数中,调用类B的构造函数,然后将其赋值到类A的对应类B这个成员变量下,这个赋值,就会调用类B的赋值运算符,而我没有去特殊定义,这样就会调用编译器生成的默认拷贝赋值运算符,将B中的数据逐bit拷贝,而拷贝B中的mutex的时候,就会报编译错误error C2280。
所以根据这样的情况,总结几种解决方案:
1.在类包含类的情况下,不要在被包含的类中使用std::mutex。
2.重写类B的赋值运算符,拷贝除了mutex以外的其他数据成员,重新构造一个新的mutex给拷贝过去的对象使用。
3.类B中的mutex可以改为一个指向mutex的指针或者shared_ptr,这样触发默认赋值运算符的时候,拷贝的就是指针,指针本身可以拷贝,也可解决问题。
C++ Error C2280 尝试引用已删除的函数(二)因std::mutex引起的拷贝相关推荐
- C++ Error C2280 尝试引用已删除的函数
学习C++的右值引用的时候,发现一个错误 1>e:\work\jutiltest\jutiltest\main.cpp(88): error C2280: "MyString::MyS ...
- 如何解决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. ...
最新文章
- 【报告】2021物联网行业研究报告(附PDF下载)
- 理解 Delphi 的类(十) - 深入方法[9] - 调用时的括号
- 【Android 逆向】ELF 文件格式 ( 程序头偏移量 | 节区头偏移量 | 处理器特定标志 | ELF 文件头大小 )
- mybatis jdbctype数据类型_mybaits-mybatis配置
- python连接高斯数据库_Python加载数据并执行多高斯fi
- PWN-COMPETITION-HGAME2022-Week4
- cuda编程_CUDA刷新器:CUDA编程模型
- C/C++基础语法,赶紧收藏好哟~
- matlab计算系统过渡过程时间,MATLAB在电机拖动拖动系统过渡过程分析中的应用
- 2012Android开发热门资料110
- 【java笔记】常用函数式接口(3):Predicate接口
- 推荐几款好用的MySQL开源客户端,建议收藏
- vue结合elementui实现输入框输入关键词显示下拉列表点击列表中关键字页面滚动到关键字所在位置
- 新浪微博PC客户端(DotNet WinForm C# 版,C#调用新浪微博API代码,源码下载)—— 初探 (第二部分内置链接)
- CSS设置阴影样式大全 包含所有样式 有图有代码
- android贪食蛇详细教程实现加源码
- 【CSS】如何设置行距、段落间距、缩进格式
- python敲七游戏代码_Python_day04_2018.7.5-(Lis列表的介绍,增删改查)
- android实现系统状态栏的隐藏方法,Android隐藏系统状态栏(沉浸式状态栏)和设置状态栏颜色...
- 淘宝/天猫盗图投诉之提交盗图申诉材料时,图片过大,如何缩小呢?