【发布时间】:2020-02-01 00:53:45
【问题描述】:
- 我有两个
enums。它们在同一个命名空间中,但头文件不同。 - 为了使它们可用于 Qt 元类型系统,我尝试这样做:
//C1.h
#include <QObject>
namespace SW
{
Q_NAMESPACE
enum class Enum1 {A, B};
Q_ENUM_NS(Enum1)
}
//C2.h
#include <QObject>
namespace SW
{
Q_NAMESPACE
enum class Enum2 {A, B};
Q_ENUM_NS(Enum2)
}
//main.c
#include <QDebug>
#include <QMetaEnum>
#include "C1.h"
#include "C2.h"
int main(int argc, char *argv[]) {
auto me1 = QMetaEnum::fromType<SW::Enum1>();
qDebug() << "me1 valid:" << me1.isValid();
auto me2 = QMetaEnum::fromType<SW::Enum2>();
qDebug() << "me2 valid:" << me2.isValid();
}
- 上面我得到重复符号链接器错误。因为
moc_C1.o和moc_C2.o都定义了staticMetaObjectthat result fromQ_NAMESPACE - 我发现两个标题中的命名空间都必须包含
Q_NAMESPACE。否则 moc 会报错“错误:命名空间声明缺少 Q_NAMESPACE 宏。” - 如果我只有 C1.h 或 C2.h 中的一个,它可以构建并正常工作。
- 如果我将 C2.h 的内容移动到 C1.h,它也可以工作,并且会打印:
me1 valid: true
me2 valid: true
- 如果我将 C2.h 的内容移动到 main.cpp(带或不带
Q_NAMESPACE),它会编译但在运行时出现故障:
me1 valid: true
me2 valid: false
问题:有没有办法将Q_NAMESPACE 用于分布在多个文件中的命名空间?
解决我能想到的这个问题的方法:
- 将我的枚举包含在 Q_OBJECT 或 Q_GADGET 类中
- 将我所有的枚举放在同一个文件中
【问题讨论】: