std::mutex 引发的 C2280 尝试引用已删除的函数

原由是把以前写的类中的 mutex 使用了(以前注释掉了没用到这个变量); 多线程

或者说添加了一个 mutex 变量, 而后 这个类有嵌套在了 其类的 map 中使用, 而后 编译 就报错svn

`函数

C2280 XXX:XXX(const XXX &) 尝试引用已删除的函数spa

C2280 XXX::operator=(const XXX &)  尝试引用已删除的函数线程

`编译

手动添加 这俩函数, 依然包错table

死活折腾不起做用, 在网上搜的, 说什么 const 变量啦,析构函数啦.... 等等都无效class

后来, 折腾的没办法, 从新 check 上个版本的 工程( 嗯, 幸亏有svn )变量

而后 一点一点 添加变化, 添加一点 编译一次,添加一点 编译一次构造函数

终于发现, TMD 是添加 了 mutex 变量后 就报错的

而后网上 搜了下,  直接给了解释:

`

因为std::mutex的拷贝构造函数被禁了:

mutex( const mutex& ) = delete;

`

麻蛋!~

而 std::vectorstd::map 都是要求 类型 必须包含拷贝构造函数的,因此就报错了。

 

且 即时 添加 mutable 关键字,也无效的.

 

最简单的方法就是 :

把  std::mutex _mutex ;改为  std::shared_ptr<std::mutex> _mutex 就能够了 

使用的时候

    std::lock_guard<std::mutex> _lock{ *_mutex };   // `*`解释获得

或者本身手动 这两个函数吧....

看状况, 若是担忧 多线程 是什么莫名其妙的锁了, 就手动 咯, 虽说写的

相关文章
相关标签/搜索