我遇到的问题是,我需要为类中的托管共享内存成员使用命名互斥体,并收到“无法访问类 boost::interprocess::named_mutex 中声明的私有(private)成员”错误。然而,我都从 boost::noncpoyable 派生了我的类,并在构造函数中使用了带有 move-semantic 的 std::unique_ptr ,但没有成功。使用boost 1_60和VS 2010,代码如下:
class FileLocker : private boost::noncopyable
{
public:
FileLocker();
~FileLocker();
private:
boost::interprocess::managed_shared_memory m_oShMem;
std::unique_ptr<boost::interprocess::named_mutex> m_oSetFileMutex;
};
cpp 文件:
FileLocker::FileLocker()
{
m_oShMem = managed_shared_memory(open_or_create, m_oMemName.c_str(), 1024);
m_oSetFileMutex = make_unique<named_mutex>( m_oShMem.find_or_construct<named_mutex>("viVideoFileInOutMutex")() );
}
最后是使唯一:
template<typename T>
std::unique_ptr<T> make_unique()
{
return std::unique_ptr<T>( new T() );
}
template<typename T, typename Ts>
std::unique_ptr<T> make_unique(Ts&& params)
{
return std::unique_ptr<T>( new T(std::forward<Ts>(params)) );
}
我读了几个关于这个问题的 Stackoverflow-Threads,但它们都指出了我已经处理过的不可复制性......
感谢您的帮助!
最佳答案
抛开其他问题不谈,您在两个地方错误地调用了 named_mutex
构造函数。
其中之一在这里:
m_oShMem.find_or_construct<named_mutex>("viVideoFileInOutMutex")()
您传递的字符串参数是共享内存中对象的名称,但它不会传递给实际对象的构造函数,在本例中为named_mutex
。所以这基本上会导致调用named_mutex
的默认构造函数,它是私有(private)的。要将参数传递给底层对象的构造函数,您必须像这样发送它们:
m_oShMem.find_or_construct<named_mutex>("viVideoFileInOutMutex")(open_or_create, "named_mutex_name")
在第二组括号中。
第二个问题在同一行开始:
m_oSetFileMutex = make_unique<named_mutex>( m_oShMem.find_or_construct<named_mutex>("viVideoFileInOutMutex")(open_or_create, "named_mutex_name") );
这基本上等同于:
named_mutex *temp = m_oShMem.find_or_construct<named_mutex>("viVideoFileInOutMutex")(open_or_create, "named_mutex_name") );
m_oSetFileMutex = make_unique<named_mutex>(temp);
您已经有一个指向 named_mutex
的原始指针,并将其传递给 make_unique
。这导致 make_unique
调用 named_mutex
的构造函数,将 named_mutex*
作为参数。这样的构造函数不存在。
关于c++ - boostnamed_mutex私有(private)成员访问错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35796156/