【问题标题】:Facing "unable to find string literal operator" error when compiling ui code with C++11使用 C++11 编译 ui 代码时遇到“无法找到字符串文字运算符”错误
【发布时间】:2015-08-12 09:31:41
【问题描述】:

我正在用我自己的 GNU makefile 编译一个 QTGUI 应用程序(版本 4)。当我在 gcc 编译器中使用 C++03 标准时,一切正常。

现在我需要 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)));

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

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

我怎样才能摆脱它?

【问题讨论】:

  • 信息不足。提供更多代码和编译器错误行。另外,什么版本的 qt - 4 或 5? 3 周前将 qt4 从 c++03 移动到 c++11 时,我们没有任何代码更改,所以 @Steve 我猜你错了。以我的经验,qt4 和 qt5 项目都可以用 c++03 和 c++11 编译,无需更改源代码。
  • @VictorPolevoy 糟糕,我在考虑 Boost... :)
  • 这有帮助吗? How to use C++11 with Qt
  • @VictorPolevoy Qt 4 不支持CONFIG += c++11。见stackoverflow.com/a/30031564/2013738
  • Qt Creator 是一个 IDE。在大多数不直接引用 IDE 的 SO 问题中提到它是完全没有必要和没有根据的。

标签: c++ qt c++11


【解决方案1】:

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

大概SIGNALSLOT 都是源代码行上的宏——我对QT 知之甚少——它们的一个或两个扩展导致"foo"__FILE__ 在预处理后出现,从而导致您观察到的错误。如果升级到更新的 QT 不是您的选择,您可以跟踪 MACROS 的定义并确保令牌之间有空格,从而导致 "foo"__FILE__。简单地插入一个空格可能就足够了,但如果宏定义涉及大量标记粘贴,那么有时需要使用注释 /**/ 强制标记中断。

【讨论】:

  • 这正是我的问题。我想补充一点,我只是用#define SLOT(a) "1"#a#define SIGNAL(a) "2"#a重新定义了window.cpp和myglwidget.h中的宏SLOT和LINK
  • 在我的字符串格式引号之后添加一个空格,并且宏可以摆脱unable to find string literal operator 'operator"" PRIu64'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 2016-02-10
  • 1970-01-01
相关资源
最近更新 更多