我正在尝试创建一个结构并插入映射如下:
struct Queue_ctx {
std::mutex qu_mutex;
std::condition_variable qu_cv;
std::queue<std::vector<std::byte>> qu;
};
std::map<std::string, Queue_ctx> incoming_q_map;
Queue_ctx qctx;
std::vector<std::byte> vect(100);
qctx.qu.push(vect);
incoming_q_map.emplace("actor", qctx);
但是我得到以下错误:
error C2660: 'std::pair<const std::string,main::Queue_ctx>::pair': function does not take 2 arguments
message : see declaration of 'std::pair<const std::string,main::Queue_ctx>::pair'
message : see reference to function template instantiation 'void std::_Default_allocator_traits<_Alloc>::construct<_Ty,const char(&)[6],main::Queue_ctx&>(_Alloc &,_Objty *const ,const char (&)[6],main::Queue_ctx &)' being compiled
with
[
_Alloc=std::allocator<std::_Tree_node<std::pair<const std::string,main::Queue_ctx>,std::_Default_allocator_traits<std::allocator<std::pair<const std::string,main::Queue_ctx>>>::void_pointer>>,
_Ty=std::pair<const std::string,main::Queue_ctx>,
_Objty=std::pair<const std::string,main::Queue_ctx>
]
emplace在原地构造元素。如果这是真的,那么为什么编译器试图创建对放置?我看到编译器合成的pair语法很奇怪,这就是为什么它会抱怨。但是为什么会发生这种情况,我能做些什么来解决这个问题呢?
我试图明确地传递make_pair()
,但没有帮助。
如果我注释qu_mutex
和qu_cv
,那么我可以做放置。误差和这两个元素有什么关系?不是默认构造函数初始化结构成员的情况吗?我知道复制/赋值/移动构造函数会被编译器删除。
无论如何,要解决这个问题,您需要自定义复制构造函数和赋值操作符。互斥锁还建议在所有场景中同步qu
,因此所有字段都应该是私有的(因此struct
应该更改为class
)。
class Queue_ctx {
mutable std::mutex qu_mutex;
std::condition_variable qu_cv;
std::queue<std::vector<std::byte>> qu;
public:
Queue_ctx() = default;
Queue_ctx(const Queue_ctx& other)
: Queue_ctx(other, std::scoped_lock{ other.qu_mutex })
{
}
Queue_ctx(const Queue_ctx& other, const std::scoped_lock<std::mutex>&)
: qu { other.qu }
{
}
Queue_ctx(Queue_ctx&& other)
: Queue_ctx(std::move(other), std::scoped_lock{ other.qu_mutex })
{
}
Queue_ctx(Queue_ctx&& other, const std::scoped_lock<std::mutex>&)
: qu { std::move(other.qu) }
{
}
Queue_ctx& operator=(const Queue_ctx& other)
{
std::scoped_lock lock{ qu_mutex, other.qu_mutex };
qu = other.qu;
return *this;
}
Queue_ctx& operator=(Queue_ctx&& other)
{
std::scoped_lock lock{ qu_mutex, other.qu_mutex };
qu = std::move(other.qu);
return *this;
}
void push(const std::vector<std::byte>& v)
{
std::unique_lock lock{ qu_mutex };
qu.push(v);
}
void push(std::vector<std::byte>&& v)
{
std::unique_lock lock{ qu_mutex };
qu.push(std::move(v));
}
};
https://godbolt.org/z/xn6orTedz
可以编译,但是需要更多的测试。请注意,缺少一些功能来使用qu_cv
。