【问题标题】:boost::mutex don't work when using it in templateboost::mutex 在模板中使用时不起作用
【发布时间】:2012-05-18 12:12:14
【问题描述】:

我正在尝试编写一个类模板:

template<typename ObjType> class SharedBuffer: private boost::noncopyable

我正在使用 boost::mutex 来同步对缓冲区数据的访问:

private: boost::mutex myMonitor;

但是当我创建锁时,我得到一个奇怪的编译错误:

template<typename ObjType>
inline void SharedBuffer<ObjType>::clear(void){
  boost::mutex::scoped_lock lk(myMonitor);
  myBuffer.clear();
}
Error   9   error C2664: 
'boost::unique_lock<Mutex>::unique_lock(boost::unique_lock<Mutex> &)' :
 cannot convert parameter 1 from
 'const boost::mutex' to 'boost::unique_lock<Mutex> &'

我不知道为什么会这样。我没有将 myMonitor 声明为常量。我正在使用 VS2010 并提升 1.4.9

【问题讨论】:

  • 是的,scoped_lock 被定义为 typedef unique_lock<:mutex> scoped_lock
  • WorksForMe(但使用 GCC 和 boost 1_46)。

标签: c++ templates boost mutex


【解决方案1】:

问题出在:

无法将参数 1 从 'const boost::mutex' 转换为 'boost::unique_lock &'

解决办法是:

私有:可变 boost::mutex myMonitor;

【讨论】:

  • 是的,如果你需要锁来读取对象,锁需要mutable
  • 您能详细说明一下吗? 为什么是非常量方法中的互斥锁突然变为 const。并且是允许所有 const 方法能够更改互斥锁的唯一解决方案吗?
  • @daramarak 我真的不知道。我同意此代码的此错误看起来很奇怪。可能真正的问题是访问常量对象的非常量方法。
  • @inkooboo,听起来像是一个可能的假设。很高兴得到确认...
猜你喜欢
  • 2015-03-04
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 2011-12-13
  • 2014-08-10
  • 1970-01-01
相关资源
最近更新 更多