lupdate错误:使用未知的命名空间/类进行限定
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lupdate错误:使用未知的命名空间/类进行限定相关的知识,希望对你有一定的参考价值。
我使用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错误),所以语法基本上是正确的。
答案是lupdate在解析foo.cpp时无法找到头文件foo.h。使用以下行扩展.pro文件可以解决此问题:
INCLUDEPATH += .
然而,令我困扰的是编译器应该无法编译代码,但不知何故,qmake在编译器选项中添加了-I.
。这就是为什么我之前没有想到包含文件的问题,花了几个小时来解决这个问题。有谁知道这是否是默认行为?另外:为什么lupdate不会发出相应的错误消息?
在我的情况下,lupdate无法解析枚举MyEnum:int {};行并没有达到类声明。 Qt 5.7.1,lupdate仍然不理解枚举的类型说明符。
我在不同的场景中得到了同样的信息。在我的情况下,问题是foo.cpp
包含#include <foo.h>
而不是#include "foo.h"
。由于这两个文件都是不在全局包含路径中的目录,因此由于include中缺少引号,lupdate
不会在该目录中查找。切换到正确的包括分隔符使lupdate
高兴。
我在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
在我的情况下,在实际的类声明之前,在结构中有一个奇怪的(但我认为合法的)格式化的类型声明。这使得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声明。我做了两个:)
以上是关于lupdate错误:使用未知的命名空间/类进行限定的主要内容,如果未能解决你的问题,请参考以下文章
PHP使用命名空间:别名/导入(Aliasing/Importing)
如何防止命名空间 HTML 元素的 Vue 错误“未知自定义元素”
另一个未知实体命名空间别名错误(Symfony2,手动创建的实体)
PHP命名空间的三种引用方式:非限定名称限定名称完全限定名称