使用C++ 11编译ui代码时遇到"无法找到字符串文字运算符"错误

Dan*_* R. 8 c++ qt c++11

我正在使用自己的GNU makefile编译QTGUI应用程序(版本4).当我使用C++ 03标准和gcc编译器时,一切都很好用.

现在我需要C++ 11标准并得到错误:

无法找到字符串文字运算符'operator'"__ FILE__'"

在我的window.cpp中的以下行

connect(ui->myGLWidget, SIGNAL(xRotationChanged(int)), ui->rotXSlider, SLOT(setValue(int)));
connect(ui->myGLWidget, SIGNAL(yRotationChanged(int)), ui->rotYSlider, SLOT(setValue(int)));
connect(ui->myGLWidget, SIGNAL(zRotationChanged(int)), ui->rotZSlider, SLOT(setValue(int)));
Run Code Online (Sandbox Code Playgroud)

我尝试使用UIC版本4和5编译我的.ui文件,但没有任何改变.每当使用Qbject :: connect(.....)时,UIC,ui_window.h的结果都会出现相同的错误.

我不能回到旧的C++标准,两个UIC编译器生成相同的ui_window.h文件.

我怎么能摆脱它?

Cas*_*sey 17

在C++ 11之前,语法"foo"__FILE__将编译为"foo""filename.cpp",从而产生连接的字符串"foofilename.cpp".C++ 11添加了一个新功能,即用户定义的字符串文字,它在字符串文字的末尾使用后缀"foo"_bar来执行字符串"foo"到其他类型的转换.因此,"foo"__FILE__现在编译作为一种尝试调用自定义字符串字面操作__FILE__"foo".

据推测SIGNAL并且SLOT都是指示源线上的宏 - 我对QT知之​​甚少 - 并且其中一个或两个扩展导致在"foo"__FILE__预处理后出现,导致您观察到的错误.如果升级到更新的QT不是您的选择,您可以跟踪MACROS的定义并确保令牌之间有空格导致"foo"__FILE__.简单地插入一个空格可能就足够了,但是如果宏定义涉及大量的令牌粘贴,那么有时需要强制带有注释的令牌中断/**/.