无法将参数 1 从"常量提升::shared_mutex"转换为"常量提升::shared_lock<Mutex> &"

cannot convert parameter 1 from 'const boost::shared_mutex' to 'const boost::shared_lock<Mutex> &'

本文关键字:shared 常量 lt 参数 gt Mutex lock 转换 mutex      更新时间:2023-10-16

我只是想实现这个关于拥有100多个赞成票的互斥体的答案。我所做的只是复制粘贴代码,这样我的课读起来(简化)如下:

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次赞成票,所以我想它很可能是正确的。

因为您的方法有const签名,所以不允许更改互斥对象的状态,因此不允许锁定它。将互斥对象更改为mutable应该可以修复错误:

mutable boost::shared_mutex _access;