面对"无法找到字符串文字运算符"使用C ++ 11

时间:2015-05-29 13:27:54

标签: c++ qt c++11

我正在使用自己的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文件。

我该怎样摆脱它?

1 个答案:

答案 0 :(得分:14)

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

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