我的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
答案 0 :(得分:4)
代码应为:
QMutexLocker something(&m_mutex);
声明一个名为something
的变量,它是一个QMutexLocker,并持续到块的结尾(在这种情况下是函数的结尾)。
代码QMutexLocker(&m_mutex);
是一个稍微令人烦恼的解析 - 它符合引用声明的语法,即它与QMutexLocker& m_mutex;
相同,后者产生错误,因为必须初始化引用。
代码QMutexLocker(&this->m_mutex);
不符合引用声明的语法,因此您不会收到该错误。但是它会创建一个临时的QMutexLocker
对象,然后立即销毁。因此,即使它没有给出编译错误,它也可能没有按照您的意图执行:在执行下一个语句之前,互斥锁将被锁定然后解锁。