与 std::d eque 一起使用时,不能将 Boost::mutex 作为私有类成员吗?
Can't have Boost::mutex as private class member when using with std::deque?
我在deque和boost::mutex方面遇到了一些麻烦,我做了一个简单的例子,它将使用下面的错误进行编译。
问题是我想拥有某个类的 deque,该类具有一个或多个互斥体作为私有成员。尽管目前该示例给出了一个错误:
错误 C2248:"提升::互斥::互斥":无法访问在类"提升::互斥"中声明的私有成员
我已经看到了一些相关的帖子,但到目前为止,我还没有设法解决这个特定问题。
任何帮助将不胜感激...
#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
。
如果您不想费心编写复制构造函数以避免复制互斥锁,则可以改用 Boost 中的指针容器。
例如:
#include <boost/ptr_container/ptr_deque.hpp>
...
boost::ptr_deque<object> obj;
obj.push_back(new object());
obj[0].process()
...
现在,双端的行为就像普通的双端面一样,但它从不尝试复制任何object
实例。
互斥锁不是 CopyConstructible,因此类型的复制构造函数格式不正确。
您可以提供一个不复制互斥锁的用户定义的复制构造函数。
您不能复制互斥锁,因此您也不能复制包含互斥锁的类。作为替代方案,您可以为您的班级制作 unique_ptr
s 的 deque
std::deque<std::unique_ptr<object>> obj;
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- std::mutex作为一个成员变量对多个线程来说是安全的吗
- std::mutex 和 condition_variable 无法访问类内的私有成员
- 以std::mutex作为参数对成员函数进行线程处理
- 与 std::d eque 一起使用时,不能将 Boost::mutex 作为私有类成员吗?
- std:mutex'es 作为将进入容器的对象的成员?
- 使用boost::mutex作为类的私有成员