【问题标题】:error: no matching function for call to 'boost::shared_lock<boost::shared_mutex>::shared_lock(const Lock&)'错误:没有匹配函数调用'boost::shared_lock<boost::shared_mutex>::shared_lock(const Lock&)'
【发布时间】:2016-11-04 03:24:20
【问题描述】:

我已经实现了如下的 ReadLock:

在 myClass.h 中

#include <boost/thread/locks.hpp>
#include <boost/thread/shared_mutex.hpp>

typedef boost::shared_mutex Lock;
typedef boost::shared_lock< Lock > ReadLock;

Lock myLock;

在 myClass.cpp 中:

void ReadFunction() const
{
    ReadLock r_lock(myLock); // Error!
    //Do reader stuff
}

该代码在 VS2010 中有效,但在 GCC4.0 中失败。编译器在 ReadLock 处抛出错误,说没有匹配的函数。我怀疑是变量 myLock 的“const”正确性问题。当我删除函数声明中的 const 时,错误消失了。有人可以向我解释一下吗?为什么这在 windows 下有效,但在 gcc 下无效?

这里有什么建议吗?谢谢。

【问题讨论】:

  • 你试过可变互斥体吗?
  • 可变的解决了问题!谢谢!

标签: c++ boost constants mutex boost-mutex


【解决方案1】:

您应该从ReadFunction() 中删除const 限定符,因为qualifying a non-member function with cvref 限定符是非法的,甚至没有意义;或者你将你想要做的任何事情封装在class中。


void ReadFunction() const
{
    ReadLock r_lock(myLock); // Error!
    //Do reader stuff
}

const 只能应用于成员函数。上面的代码不是成员函数,如果是,那就是,(例如,一个名为MyClass的类):

void MyClass::ReadFunction() const
{
    ReadLock r_lock(myLock);
    //Do reader stuff
}

在这种情况下,您通常需要将lock 设为mutable 成员。通过这样声明:

class MyClass{
    ....
    mutable Lock myLock;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多