必须初始化QMutexLocker,QMutex C2530参考

时间:2017-07-05 00:10:36

标签: 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;
};

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

时,它可以正常工作

1 个答案:

答案 0 :(得分:4)

代码应为:

QMutexLocker something(&m_mutex);

声明一个名为something的变量,它是一个QMutexLocker,并持续到块的结尾(在这种情况下是函数的结尾)。

代码QMutexLocker(&m_mutex);是一个稍微令人烦恼的解析 - 它符合引用声明的语法,即它与QMutexLocker& m_mutex;相同,后者产生错误,因为必须初始化引用。

代码QMutexLocker(&this->m_mutex);不符合引用声明的语法,因此您不会收到该错误。但是它会创建一个临时的QMutexLocker对象,然后立即销毁。因此,即使它没有给出编译错误,它也可能没有按照您的意图执行:在执行下一个语句之前,互斥锁将被锁定然后解锁。