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

Tom*_*ica 2 c++ boost visual-studio-2010 c++11

我只是想用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;
};
Run Code Online (Sandbox Code Playgroud)

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.";
}
Run Code Online (Sandbox Code Playgroud)

而且我得到一个错误,仅针对读取的互斥行:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 从 const boost::shared_mutex
  • 至 const boost::shared_lock<Mutex> &

我在做什么错呢?该链接的答案被投票了100次,所以我想这很可能是正确的。

Dan*_*rul 7

因为您的方法具有const签名,所以不允许您更改互斥体状态,因此不允许对其进行锁定。将互斥锁更改为mutable应修复以下错误:

mutable boost::shared_mutex _access;
Run Code Online (Sandbox Code Playgroud)