Qt5:此代码使用 msvc2012 编译正常,但使用 MinGW 编译时出错...为什么?
Qt5: This code compiles ok with msvc2012, yet gives error compiled with MinGW... Why?
我在 Windows7 平台上使用 Qt5.5.1。
我有以下代码可以使用 msvc2012 构建工具包编译(和运行):
void MyDialog::accept()
{
DataBase::instance()->logEventMessage(tr("Modified settings!"));
close();
}
其中 logEventMessage 是:
int logEventMessage(QString & eventDescription);
当我切换到 MinGW 构建工具包时,编译器说:
No matching function for call to DataBase::logEventMessage(QString)...
好吧,解决这个问题很简单(编译器期望有一个 QString&):
void MyDialog::accept()
{
QString text(tr("Modified settings!"));
DataBase::instance()->logEventMessage(text);
close();
}
然而,有两件事仍然困扰着我 :
1) 为什么初始代码可以使用 msvc2012 构建工具包编译(但不能使用 MinGW 编译)?
2) 哪个编译器是 C++ "correct" ?... ;)
您的函数需要 QString&
。这是一个输入和输出参数。您使用临时构造它,从而丢弃它所做的任何更改。设计明智,这是可疑的。
可能您想参加 const&
。
根据 C++ 标准,您不能将临时变量绑定到对非常量的引用。
MSVC 有一个不符合要求的扩展,可以防止发生该错误。
具有正确编译器标志的 MSVC 2015 行为正常。
我在 Windows7 平台上使用 Qt5.5.1。
我有以下代码可以使用 msvc2012 构建工具包编译(和运行):
void MyDialog::accept()
{
DataBase::instance()->logEventMessage(tr("Modified settings!"));
close();
}
其中 logEventMessage 是:
int logEventMessage(QString & eventDescription);
当我切换到 MinGW 构建工具包时,编译器说:
No matching function for call to DataBase::logEventMessage(QString)...
好吧,解决这个问题很简单(编译器期望有一个 QString&):
void MyDialog::accept()
{
QString text(tr("Modified settings!"));
DataBase::instance()->logEventMessage(text);
close();
}
然而,有两件事仍然困扰着我 :
1) 为什么初始代码可以使用 msvc2012 构建工具包编译(但不能使用 MinGW 编译)?
2) 哪个编译器是 C++ "correct" ?... ;)
您的函数需要 QString&
。这是一个输入和输出参数。您使用临时构造它,从而丢弃它所做的任何更改。设计明智,这是可疑的。
可能您想参加 const&
。
根据 C++ 标准,您不能将临时变量绑定到对非常量的引用。
MSVC 有一个不符合要求的扩展,可以防止发生该错误。
具有正确编译器标志的 MSVC 2015 行为正常。