2017-07-05 734 views
2

我有QMutex m_mutex;作爲我的類中的私有字段,我嘗試從其中一個方法使用QMutexLocker鎖定它,但是當我嘗試構建它時,出現C2530錯誤(我的編譯器是MSVC 2015)。QMutexLocker,QMutex C2530引用必須初始化

#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

***但是當我嘗試構建它時,出現C2530錯誤***如果您從「輸出」選項卡中發佈了錯誤消息的確切文本,它會幫助您解決問題。 – drescherjm

+0

@drescherjm確切的錯誤消息在標題中。 **錯誤C2530:引用必須初始化**問題可以通過預先加入this->來解決,但是我不明白爲什麼沒有'this->'它不能工作,也許這只是MSVC錯誤,他們已經自2015年以來,他們的編譯器改變了很多... BR – lll

+3

哦,我現在看到了。你想'QMutexLocker mylock(&m_mutex)'而不是'QMutexLocker(&m_mutex)' – drescherjm

回答

3

的代碼應該是:

QMutexLocker something(&m_mutex); 

該聲明瞭一個名爲something這是一個QMutexLocker變量,並一直持續到塊結束(這是本例中函數的結尾)。

代碼QMutexLocker(&m_mutex);是一個稍微令人頭痛的解析 - 它適合引用聲明的語法,即它與QMutexLocker& m_mutex;相同,因爲必須初始化引用,所以會產生錯誤。

代碼QMutexLocker(&this->m_mutex);不符合引用聲明的語法,所以您不會收到該錯誤。然而,它會創建一個臨時對象,然後立即銷燬。所以,儘管它沒有給出編譯錯誤,但它可能不會達到你想要的目標:在執行下一條語句之前,互斥鎖將被鎖定並解鎖。

相關問題