gpt4 book ai didi

c++ - Qt C++ : Multiple Q_NAMESPACE for the same namespace in different files

转载 作者:行者123 更新时间:2023-12-02 10:36:36 25 4
gpt4 key购买 nike

  • 我有两个 enum s。它们在同一个命名空间中,但不同的头文件。
  • 为了使它们可用于 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();
    }
  • 有了上面我得到重复的符号链接(symbolic link)器错误。因为两者 moc_C1.omoc_C2.o定义 staticMetaObject that result from Q_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 类
  • 将我所有的枚举放在同一个文件中
  • 最佳答案

    根据他们的问题跟踪器 QTBUG-68611,这似乎是一个已知错误

    我们将不得不忍受这个限制,直到它被解决。

    或者,您可以 (虽然我不建议)中间有一个文件结构,例如:

    // internal/C1.h
    #include <QObject>
    enum class Enum1 {A, B};
    Q_ENUM_NS(Enum1)
    //internal/C2.h
    #include <QObject>
    enum class Enum2 {A, B};
    Q_ENUM_NS(Enum1)
    // C.h
    #include <QObject>
    namespace SW
    {
    Q_NAMESPACE
    #include internal/C1.h
    #include internal/C2.h
    }

    关于c++ - Qt C++ : Multiple Q_NAMESPACE for the same namespace in different files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60013093/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com