添加到地图的类中的互斥锁不起作用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<int,unique_ptr<test>>
,然后设为testmap[1] = make_unique<test>();
。
【参考方案1】:
std::mutex
is 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”不起作用
Firebase 数据库中的 setValue() 方法不起作用。值未添加到数据库中