lupdate错误:使用未知的命名空间/类进行限定

问题描述 投票:7回答:5

我使用lupdate v4.7.2遇到了一个非常奇怪的错误。我收到了错误消息

module / foo.cpp:6:使用unknown namespace / class :: foo进行限定

对于一个有大约50个班级的项目中的几个班级。我将问题归结为一个简单的例子:

SRC / project.pro:

QT       += core
TARGET = test
TEMPLATE = app

SOURCES += main.cpp \
           screen.cpp

HEADERS += screen.h

TRANSLATIONS += de.ts

SRC /模块/ foo.h中:

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

SRC /模块/ Foo.cpp中:

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

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

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

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

qt internationalization namespaces translation
5个回答
7
投票

答案是lupdate在解析foo.cpp时无法找到头文件foo.h。使用以下行扩展.pro文件可以解决此问题:

INCLUDEPATH += .

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


3
投票

在我的情况下,lupdate无法解析枚举MyEnum:int {};行并没有达到类声明。 Qt 5.7.1,lupdate仍然不理解枚举的类型说明符。


1
投票

我在不同的场景中得到了同样的信息。在我的情况下,问题是foo.cpp包含#include <foo.h>而不是#include "foo.h"。由于这两个文件都是不在全局包含路径中的目录,因此由于include中缺少引号,lupdate不会在该目录中查找。切换到正确的包括分隔符使lupdate高兴。


1
投票

我在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”的问题可以通过使用marco用于术语“枚举类”来解决:

#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

1
投票

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

struct coords_t {
  double x, y;
  ...
};

struct plotsCollection {
  QVarLengthArray<struct coords_t> coords;  // problem right here
  ...
};

class LogsDialog : public QDialog
{
  Q_OBJECT
  ...
}

struct删除QVarLengthArray<struct coords_t>解决了警告。所以在类中移动了struct声明。我做了两个:)

© www.soinside.com 2019 - 2024. All rights reserved.