2015-12-24 8 views
2

我在Windows7平臺上使用Qt5.5.1。
我有以下代碼,編譯(並運行)細跟msvc2012構建試劑盒:Qt5:這段代碼編譯好了msvc2012,但卻給MinGW編譯錯誤...爲什麼?

void MyDialog::accept() 
{ 
    DataBase::instance()->logEventMessage(tr("Modified settings!")); 
    close(); 
} 

其中logEventMessage是:

int logEventMessage(QString & eventDescription); 

當我切換到MinGW的構建試劑盒,所述編譯器,所述:

否調用數據庫:: logEventMessage(QString的)匹配功能...

好了,固定的問題很容易(編譯器要求爲QString &那裏):

void MyDialog::accept() 
{ 
    QString text(tr("Modified settings!")); 
    DataBase::instance()->logEventMessage(text); 
    close(); 
} 

然而,兩件事情仍然百思不得其解
1)爲什麼最初的代碼被編譯OK用msvc2012構建工具包(雖然它不是用MinGW編譯)?
2)哪個編譯器是C++ 「正確」 ......;?)

+0

這可能是允許將臨時對象綁定到非const左值引用的MSVC擴展 –

+2

要修復它,請將該函數更改爲int logEventMessage(QString const&eventDescription);(它應該放在第一位,因爲在記錄日誌時不修改消息) –

回答

4

你的函數需要一個QString&。這是一個輸入和輸出參數。你用臨時的構造它,從而放棄它所做的任何改變。設計明智這是可疑的。

也許你想採取const&

在C++標準下,您不能將臨時綁定到對非const的引用。

MSVC有一個不合格的擴展名,可防止發生該錯誤。

具有正確編譯器標誌的MSVC 2015行爲正常。