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

时间:2011-06-28 10:16:22

标签: qt internationalization namespaces translation

我使用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中有一个空主函数。

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

6 个答案:

答案 0 :(得分:7)

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

INCLUDEPATH += .

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

答案 3 :(得分: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用于术语“enum class”来解决:

#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

答案 4 :(得分:1)

在我的情况下,在实际的类声明之前,在结构中有一个奇怪的(但我认为合法的)格式化类型声明。这使得# include RPi libraries in to Python code import RPi.GPIO as GPIO import time import matplotlib.pyplot as plt from drawnow import drawnow # instantiate GPIO as an object GPIO.setmode(GPIO.BCM) # define GPIO pins with variables a_pin and b_pin a_pin = 18 b_pin = 23 gainF = [] gainString = 0 plt.ion() x_axis = 0 def makeFig(): plt.ylim(200,210) plt.xlim(0,100) plt.title('Readings') plt.grid(True) plt.ylabel('Gain') print(gainString) print(x_axis) plt.plot(gainString, x_axis) plt.show() #plt.plot(gainString, 'ro-', label='Gain dBm') # create discharge function for reading capacitor data def discharge(): GPIO.setup(a_pin, GPIO.IN) GPIO.setup(b_pin, GPIO.OUT) GPIO.output(b_pin, False) time.sleep(0.005) # create time function for capturing analog count value def charge_time(): GPIO.setup(b_pin, GPIO.IN) GPIO.setup(a_pin, GPIO.OUT) count = 0 GPIO.output(a_pin, True) while not GPIO.input(b_pin): count = count +1 return count # create analog read function for reading charging and discharging data def analog_read(): discharge() return charge_time() # provide a loop to display analog data count value on the screen while True: print(analog_read()) gainString = analog_read() x_axis = x_axis + 1 #dataArray = gainString.split(',') #gain = float(dataArray[0]) #gainF.append(gain) makeFig() plt.pause(.000001) time.sleep(1) #GPIO.cleanup() 跳过了课程并导致了“不合格”的警告信息。代码看起来像这样(开头不是我的;-)):

lupdate

struct coords_t { double x, y; ... }; struct plotsCollection { QVarLengthArray<struct coords_t> coords; // problem right here ... }; class LogsDialog : public QDialog { Q_OBJECT ... } 移除struct解决了警告。所以在类中移动了struct声明。我做了两个:)

答案 5 :(得分:0)

如果将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文件似乎已正确更新。