【问题标题】:lupdate error: Qualifying with unknown namespace/classlupdate 错误:使用未知命名空间/类进行限定
【发布时间】:2011-09-24 04:43:28
【问题描述】:

我在使用 lupdate v4.7.2 时遇到了一个非常特殊的错误。我收到错误消息

module/foo.cpp:6: 使用未知命名空间/类::foo 进行限定

在一个大约有 50 个类的项目中使用几个类。我把问题归结为一个简单的例子:

src/project.pro:

QT       += core
TARGET = test
TEMPLATE = app

SOURCES += main.cpp \
           screen.cpp

HEADERS += screen.h

TRANSLATIONS += de.ts

src/module/foo.h:

namespace sp {
class foo {
    initWidgets();
};
} // namespace sp

src/module/foo.cpp:

#include <QString>
#include "module/foo.h"

namespace sp {
    foo::initWidgets() {
    QString bar = tr("bar");
}
} // namespace sp

main.cpp 中有一个空的 main 函数。

代码可以编译(除非我在这里可能产生任何 copypasta 错误),所以语法基本上是正确的。

【问题讨论】:

  • 您缺少initWidgets(); 的返回类型

标签: qt internationalization namespaces translation


【解决方案1】:

答案是 lupdate 在解析 foo.cpp 时无法定位头文件 foo.h。使用以下行扩展 .pro 文件消除了该问题:

INCLUDEPATH += .

然而,让我有点困扰的是编译器应该无法编译代码,但不知何故,qmake 在编译器选项中添加了-I.。这就是为什么我之前没有想到包含文件问题并花了几个小时来解决这个问题。有谁知道这是否是默认行为?另外:为什么 lupdate 没有发出适当的错误消息?

【讨论】:

  • 我遇到了同样的问题,您的解决方案并没有立即为我工作,但为我指明了正确的方向。根据this bug 报告,问题的根源在于 lupdate 搜索相对于当前目录的包含文件。就我而言,我必须添加INCLUDEPATH += ../src,因为当前目录是./translations
  • @Wutz 谢谢。您的评论进一步帮助我解决了构建错误。
【解决方案2】:

我刚刚在不同的场景中收到了同样的信息。就我而言,问题在于foo.cpp 包含#include &lt;foo.h&gt; 而不是#include "foo.h"。由于这两个文件都是不在全局包含路径中的目录,lupdate 由于包含中缺少引号而无需费心查找该目录。切换到正确的包含分隔符让lupdate 开心。

【讨论】:

    【解决方案3】:

    就我而言,lupdate 无法解析枚举 MyEnum:int {};行并未能达到类声明。 Qt 5.7.1,lupdate 仍然不理解枚举的类型说明符。

    【讨论】:

    • 这对我来说是个问题。很烦人。您找到解决方法了吗?
    【解决方案4】:

    我在 Ubuntu 12.04 系统上使用 Qt 5.4.1 时也看到了此错误消息。

    但错误的原因不同。 “lupdate”似乎对 C++-11 强枚举有问题,至少在使用封装在命名空间中的相关前向声明时。

    我在相关的头文件中使用了这样的东西:

    namespace outer {
    namespace other {
      enum class MyEnum : int;
    } // namespace outer::other
    
    namespace inner {
       class MyClass {
         //...
       };
    } // namespace outer::inner
    } // namespace outer
    

    “lupdate”的问题可以通过使用术语“枚举类”的宏来解决:

    #ifndef ENUM_CLASS
    #define ENUM_CLASS enum class
    #endif
    
    namespace outer {
    namespace other {
      ENUM_CLASS MyEnum : int;
    } // namespace outer::other
    
    namespace inner {
       class MyClass {
         //...
       };
    } // namespace outer::inner
    } // namespace outer
    

    【讨论】:

      【解决方案5】:

      在我的例子中,在实际类声明之前的结构中有一个奇怪的(但我猜是合法的)格式化类型声明。这使lupdate 跳过课程并导致“不合格”警告消息。代码看起来像这样(一开始不是我的 ;-)):

      struct coords_t {
        double x, y;
        ...
      };
      
      struct plotsCollection {
        QVarLengthArray<struct coords_t> coords;  // problem right here
        ...
      };
      
      class LogsDialog : public QDialog
      {
        Q_OBJECT
        ...
      }
      

      QVarLengthArray&lt;struct coords_t&gt; 中删除struct 解决了警告。在类中移动结构声明也是如此。我都做了:)

      【讨论】:

        【解决方案6】:

        如果tr()-宏放置在嵌套太深的子文件夹中,也会出现此错误。

        例如,在以下示例中,命令 lupdate -noobsolete . -ts ts/* 错误消息读取 pwd/a/b/c/c.cpp:5: Qualifying with unknown namespace/class ::C.

        QT       += core gui
        
        SOURCES += \
            main.cpp \
            a/a.cpp \
            a/b/b.cpp \
            a/b/c/c.cpp
        
        HEADERS += \
            a/a.h \
            a/b/b.h \
            a/b/c/c.h
        
        TRANSLATIONS += \
            ts/foo.ts
        

        但是,正如其他人已经提到的,*.ts-文件似乎已正确更新。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多