gpt4 book ai didi

c++ - 与 std::deque 一起使用时不能将 Boost::mutex 作为私有(private)类成员吗?

转载 作者:太空狗 更新时间:2023-10-29 23:33:42 26 4
gpt4 key购买 nike

我在使用 deque 和 boost::mutex 时遇到了一些问题,我做了一个简单的示例,编译时会出现以下错误。

问题是我想要某个类的双端队列,它有一个或多个互斥锁作为私有(private)成员。虽然目前这个例子给出了一个错误:

错误 C2248:“boost::mutex::mutex”:无法访问类“boost::mutex”中声明的私有(private)成员

我看过一些相关的帖子,但到目前为止我还没有设法解决这个具体问题。

任何帮助将不胜感激......

#include <iostream>  
#include <boost/thread.hpp>
#include <deque>

using namespace std;

class object {
public:
void process(void)
{
m_mutex.lock();
// do something
a = a*10;
m_mutex.unlock();
}
object(int v){ a = v; }
private:
int a;
boost::mutex m_mutex;
};

int main(int argc, char* argv[])
{
deque<object> obj;

obj.push_back( object( 1 ) );
obj.push_back( object( 2 ) );
obj.push_back( object( 3 ) );

obj.at(0).process();
obj.at(1).process();
obj.at(2).process();

return 0;
};

最佳答案

obj.push_back( object( 1 ) );

上面的行创建了一个临时的 object 实例,然后将其复制构造到 deque 元素中。由于 boost::mutex 不可复制构造,因此编译器无法为 object 合成复制构造函数。

如果这是唯一需要 object 可复制构造的地方,请将语句更改为

obj.emplace_back( 1 );

emplace_back 导致 object 实例在原地构造,而不是使用复制构造。


如果您无权访问 C++11 功能,请将 object 类更改为以下内容:

#include <memory>

class object {
public:
void process(void)
{
m_mutex->lock();
// do something
a = a*10;
m_mutex->unlock();
}
object(int v)
: m_mutex( std::make_shared<boost::mutex>() )
{
a = v;
}

private:
int a;
std::shared_ptr<boost::mutex> m_mutex;
};

在 VS2008 中,您可能必须改用 std::tr1::shared_ptr

关于c++ - 与 std::deque 一起使用时不能将 Boost::mutex 作为私有(private)类成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10806715/

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