gpt4 book ai didi

c++ - 添加到 map 的类中的互斥锁不起作用c++

转载 作者:行者123 更新时间:2023-12-03 07:15:12 26 4
gpt4 key购买 nike

我正在尝试将一个 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;
}
如果您从类中删除互斥锁,则代码编译得非常好。我怎样才能解决这个问题?

最佳答案

一个 std::mutex is not copyable or movable .这意味着具有互斥锁作为成员的类没有默认的复制构造函数。这使得它在大多数容器中的使用都受到了限制,包括 map 。这就是您的编译错误的原因。您正在尝试以需要制作拷贝的方式在 map 中创建新条目,并且无法复制该类。
您可以定义显式复制构造函数和赋值运算符,并以对您的test 有意义的任何方式实现它们。类(class)。这是一种选择。
或者,可以直接在 std::map 中小心翼翼地创建不可复制的对象。 .您不能使用最常用的方法将新值复制或移动到 map 中。诀窍是避免在过程中复制它们;但将它们构建到位:

map<int,test> testmap;
test &new_test=testmap[1];
这是 [] 的一种情况。运算符重载很方便,但前提是类具有默认构造函数。您也可以使用 try_emplace从 C++17 开始:
map<int,test> testmap;

test &new_test=testmap.try_emplace(1).first->second;
这会在 std::map 中创建一个新条目。 ,谁的值(value),你的 test目的;它也被 build 到位。查看涵盖 C++17 的教科书, or cppreference了解更多信息。如果一个类没有默认构造函数并且它的显式构造函数需要任何参数,你可以将它们插入 try_emplace , 转发给构造函数。

关于c++ - 添加到 map 的类中的互斥锁不起作用c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64744588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com