QMutexLocker,QMutex C2530引用必须初始化

Kon*_*rad 4 c++ qt

QMutex m_mutex;在班级中拥有一个私有字段,我尝试使用QMutexLocker一种方法锁定它,但是当我尝试构建它时出现C2530错误。(我的编译器是MSVC 2015)。

#include <QObject>
#include <QMutex>
#include <QMutexLocker>

class MyClass : public QObject
    Q_OBJECT
public:
    MyClass(QObject *parent = 0) : QObject(parent) {}

    void setValue(const SomeEnum& val) 
    {
        QMutexLocker(&m_mutex) // C2530
        m_enum = val;
    }
private:
    QMutex m_mutex;
    SomeEnum m_enum;
};
Run Code Online (Sandbox Code Playgroud)

编辑:当我使用它 &this->m_mutex

M.M*_*M.M 5

代码应为:

QMutexLocker something(&m_mutex);
Run Code Online (Sandbox Code Playgroud)

它声明一个名为somethingQMutexLocker 的变量,并一直持续到块的末尾(在本例中为函数的末尾)。

该代码QMutexLocker(&m_mutex);是一个有点烦人的解析-适合引用声明的语法,即与相同QMutexLocker& m_mutex;,由于必须初始化引用,因此会产生错误。

该代码QMutexLocker(&this->m_mutex);不适合引用声明的语法,因此不会出现该错误。但是,它会创建一个临时QMutexLocker对象,然后将其立即销毁。因此,即使它没有产生编译错误,也可能未达到您的预期目的:互斥锁将被锁定,然后在执行下一条语句之前被解锁。