【问题标题】:MOC adding namespace to class namesMOC 将命名空间添加到类名
【发布时间】:2010-04-21 15:58:03
【问题描述】:

我在编译项目时遇到了这个非常奇怪的问题。 MOC 似乎正在向被 moc'ed 的类名添加命名空间,尽管文件/类中的任何地方都没有提到它。

然而,命名空间存在于我使用的库中,但它隐藏在头文件中很远的地方,我不在 UI 文件中使用它。这是 MOC 生成的:

const QMetaObject SmpTl::CaptureController::staticMetaObject = {
{ &QObject::staticMetaObject, qt_meta_stringdata_SmpTl__CaptureController,
  qt_meta_data_SmpTl__CaptureController, 0 }};

SmpTl 命名空间在 CaptureController 的声明中没有提及,但它出现在 MOC 生成的 .cpp 文件中。

我正在使用带有 QT 集成的 Visual Studio。

【问题讨论】:

    标签: c++ qt compilation moc


    【解决方案1】:

    我也遇到了这个问题。我的代码看起来像这样:

    namespace foo {
        #ifdef _WIN32
        ...   // This code was fine
        #else
        #error Not Supported
        #endif
    }
    

    这让 MOC 陷入思考命名空间foo 从未关闭。显然,它不知道 _WIN32 已定义,并且因为我忘记在错误消息周围加上引号而被绊倒了。将其更改为:

    #error "Not Supported"
    

    解决了我的问题。

    【讨论】:

    • 遇到完全相同的问题,谢谢!只有当#error 行包含单引号' 字符时,我才必须添加它。删除' 或将错误字符串括在双引号" 中为我解决了这个问题。
    【解决方案2】:

    SmpTl 是命名空间 CaptureController 定义在其中,因为它是由 MOC 找到的。

    Q_OBJECT 宏在您的类定义中扩展为 staticMetaObject-变量的声明(以及它扩展为的其他内容)。 MOC 文件包含该变量的定义。

    如果这不正确,请发布您的 Qt 版本和头文件的精简版本。

    【讨论】:

    • 我发现了问题,它是在包含列表中的某个头文件的 asm 代码中缺少 '"'。该代码仅适用于 MIPS 架构,因此编译器没有抱怨丢失的“,但不知何故MOC感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多