我正在使用自己的GNU makefile编译QTGUI应用程序(版本4)。当我使用C ++ 03标准和gcc编译器时,一切都很好用。
现在我需要C ++ 11标准并得到错误:
无法找到字符串文字运算符'运算符"" __文件__' "
在我的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)));
我尝试使用UIC版本4和5编译我的.ui文件,但没有任何改变。每当使用Qbject :: connect(.....)时,UIC,ui_window.h的结果都会出现相同的错误。
我无法回到旧的C ++标准,两个UIC编译器生成相同的ui_window.h文件。
我该怎样摆脱它?
答案 0 :(得分:14)
在C ++ 11之前,语法"foo"__FILE__
将编译为"foo""filename.cpp"
,从而产生连接字符串"foofilename.cpp"
。 C ++ 11添加了一个新功能user-defined string literals,它在字符串文字"foo"_bar
的末尾使用后缀来执行字符串"foo"
到其他类型的转换。因此,"foo"__FILE__
现在编译为尝试在__FILE__
上调用用户定义的字符串文字运算符"foo"
。
据推测,SIGNAL
和SLOT
都是指示的源行上的宏 - 我对QT知之甚少 - 并且其中一个或两个扩展导致在预处理后出现"foo"__FILE__
,结果在您观察到的错误中。如果升级到更新的QT不适合您,您可以跟踪MACROS的定义并确保令牌之间有空格,从而产生"foo"__FILE__
。简单地插入一个空格可能就足够了,但是如果宏定义涉及大量的令牌粘贴,那么有时候需要用注释/**/
强制令牌中断。