zoukankan      html  css  js  c++  java
  • std::mutex 引起的 C2280 尝试引用已删除的函数

    起因是把之前写的类中的 mutex 使用了(之前注释掉了没用到这个变量); 

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

    `

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

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

    `

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

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

    后来, 折腾的没办法, 重新 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 };   // `*`解释得到

    或者自己手动 这两个函数吧....

    看情况, 如果担心 多线程 是什么莫名其妙的锁了, 就手动 咯, 虽然说写的

  • 相关阅读:
    JSON
    Iterator
    JSP内置对象和EL内置对象
    JavaBean简介
    Java关键字final、static使用总结
    static 语句块
    修改tomcat端口号的方法
    URL和URI的区别
    java.util.vector中的vector的详细用法
    java中Long 和long的区别
  • 原文地址:https://www.cnblogs.com/lzpong/p/10138872.html
Copyright © 2011-2022 走看看