添加到地图的类中的互斥锁不起作用c ++

Posted

技术标签:

【中文标题】添加到地图的类中的互斥锁不起作用c ++【英文标题】:Mutex in a class added to map doesn't work c++ 【发布时间】:2020-11-09 00:53:08 【问题描述】:

我正在尝试将一个 int 映射到一个类。由于某种原因,当我运行代码时它无法编译。代码如下。

#include <iostream>
#include <mutex>
#include <map>

 
using namespace std;

class test 
private:
    mutex thismutex;
public:
    test()
        
    ;
    ~test()

    ;
;

int main() 
    map<int,test> testmap;
    testmap[1] = test();

    return 0;

如果您从类中删除互斥锁,则代码编译得非常好。我该如何解决这个问题?

【问题讨论】:

因为mutex 成员,test 是不可赋值的,所以试图赋值给testmap[1] 的尝试编译失败。 testmap.emplace(1, ) 可能会起作用(我懒得测试)。或者,您可以提供test::operator= 您可以将其设为map&lt;int,unique_ptr&lt;test&gt;&gt;,然后设为testmap[1] = make_unique&lt;test&gt;(); 【参考方案1】:

std::mutexis not copyable or movable。这意味着具有互斥锁作为成员的类没有默认的复制构造函数。这使得它在大多数容器中的使用都受到了限制,包括地图。这就是您的编译错误的原因。您正在尝试以需要制作副本的方式在地图中创建新条目,并且无法复制该类。

您可以定义一个显式的复制构造函数和一个赋值运算符,并以任何对您的test 类有意义的方式来实现它们。这是一种选择。

或者,可以直接在std::map 中小心翼翼地创建不可复制的对象。您不能使用最常用的方法将新值复制或移动到地图中。诀窍是避免在过程中复制它们;但是在适当的位置构建它们:

map<int,test> testmap;
test &new_test=testmap[1];

这是[] 运算符重载很方便的一种情况,但前提是类具有默认构造函数。你也可以使用 C++17 中的try_emplace

map<int,test> testmap;

test &new_test=testmap.try_emplace(1).first->second;

这会在std::map 中创建一个新条目,其值是您的test 对象;它也被建造到位。有关更多信息,请参阅涵盖 C++17 的教科书or cppreference。如果一个类没有默认构造函数并且其显式构造函数需要任何参数,您可以将它们推入try_emplace,以转发给构造函数。

【讨论】:

以上是关于添加到地图的类中的互斥锁不起作用c ++的主要内容,如果未能解决你的问题,请参考以下文章

目标 C:如果将标签添加到单元格,则 UITable 方法“didSelectRowAtIndexPath”不起作用

JTable 中的错误不起作用

C中的二进制到十进制转换器在某个数字后不起作用

Firebase 数据库中的 setValue() 方法不起作用。值未添加到数据库中

将 Vue.js 添加到 Rails 5.1 和 Mocha 中的单元测试不起作用

添加到 ASP.NET Core 项目中的 site.css 文件时,CSS 不起作用。但是当作为内联添加时有效