我在类中将QMutex m_mutex;
作为私有(private)字段,尝试从其中一种方法中使用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
时它有效 最佳答案
代码应为:
QMutexLocker something(&m_mutex);
它声明了一个称为
something
的变量,它是一个QMutexLocker,并一直持续到块的末尾(在本例中为函数的末尾)。代码
QMutexLocker(&m_mutex);
是一个有点烦人的解析-适合引用声明的语法,即,它与QMutexLocker& m_mutex;
相同,由于引用必须初始化,因此会产生错误。代码
QMutexLocker(&this->m_mutex);
不适合引用声明的语法,因此不会出现该错误。但是,它将创建一个临时的QMutexLocker
对象,然后立即将其销毁。因此,即使没有给出编译错误,它也可能没有达到您的预期目的:互斥锁将被锁定,然后在执行下一条语句之前被解锁。