无法将参数1从'const boost :: shared_mutex'转换为'const boost :: shared_lock <mutex>&amp;'

时间:2015-10-29 12:00:36

标签: c++ visual-studio-2010 c++11 boost

我只是想实施this answer about mutexes with over 100 upvotes。我所做的只是复制粘贴代码,以便我的类读取(简化)如下:

mymutexclass.h

class MyMutexClass {
public:
    void write( uint32_t id, const std::string &str );
    std::string read( uint32_t id ) const;

private:
    boost::shared_mutex _access;
    std::map<uint32_t, std::string> strings;
};

mymutexclass.cpp

void MyMutexClass::write( uint32_t id, const std::string &str ) {
    boost::unique_lock< boost::shared_mutex > lock(_access);
    strings[id] = name;
}
std::string MyMutexClass::read( const uint32_t id ) const {
    boost::shared_lock< boost::shared_mutex > lock(_access); // ERROR HERE
    if( strings.count( id )>0) 
        return strings.at(id);
    else
        return "No value.";
}

我收到错误,仅针对读取互斥线:

error C2664: 'boost::shared_lock<Mutex>::shared_lock(const boost::shared_lock<Mutex> &)' : cannot convert parameter 1 from 'const boost::shared_mutex' to 'const boost::shared_lock<Mutex> &'   D:\... path ...\mymutexclass.cpp

我完全迷失了错误 - 它抱怨的类型有什么区别?我的意思是这些,来自错误:

  • 来自const boost::shared_mutex
  • const boost::shared_lock<Mutex> &

我做错了什么?这个相关的答案被提升了100次,所以我想这很可能是正确的。

1 个答案:

答案 0 :(得分:6)

由于您的方法具有const签名,因此不允许更改互斥锁状态,因此不允许您锁定它。将互斥锁更改为mutable应该可以解决错误:

mutable boost::shared_mutex _access;