在QGlobal.h中将'sizeof'无效应用于不完整类型'QStaticAssertFailure <false>'

Vic*_*tor 2 c++ qt sizeof

我目前正在将一个巨大的项目从Qt 4.x迁移到5.2.1,在此错误之前,一切都相当不错,我发现它非常令人困惑,因为它位于Qt文件中,我相信解决方案必须应用于其他地方,不在位于5.2.1\mingw48_32\include/QtCore/qglobal.h的qglobal.h中.错误必定发生在其他地方.

继承人错误:

..........\Qt5\5.2.1\mingw48_32\include/QtCore/qglobal.h:681:85:错误:'sizeof'无效应用于不完整类型'QStaticAssertFailure' 枚举{Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result ,COUNTER)= sizeof(QStaticAssertFailure)} ^

..........\Qt5\5.2.1\mingw48_32\include/QtCore/qglobal.h:686:47:注意:扩展宏'Q_STATIC_ASSERT'#define Q_STATIC_ASSERT_X(条件,消息)Q_STATIC_ASSERT(条件)^

..........\Qt5\5.2.1\mingw48_32\include/QtCore/qobject.h:520:5:注意:在扩展宏'Q_STATIC_ASSERT_X'Q_STATIC_ASSERT_X(QtPrivate :: HasQ_OBJECT_Macro :: Value, ^

这是qglobal.h中的代码段

// Intentionally undefined
template <bool Test> class QStaticAssertFailure;
template <> class QStaticAssertFailure<true> {};

#define Q_STATIC_ASSERT_PRIVATE_JOIN(A, B) Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B)
#define Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B) A ## B
#ifdef __COUNTER__
#define Q_STATIC_ASSERT(Condition) \
    enum {Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __COUNTER__) = sizeof(QStaticAssertFailure<!!(Condition)>)}
#else
#define Q_STATIC_ASSERT(Condition) \
    enum {Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __LINE__) = sizeof(QStaticAssertFailure<!!(Condition)>)}
#endif /* __COUNTER__ */
#define Q_STATIC_ASSERT_X(Condition, Message) Q_STATIC_ASSERT(Condition)
#endif
Run Code Online (Sandbox Code Playgroud)

我已经尝试了所有的东西,并研究了所有相关的,但没有找到一个合适的解决方案.我整天浪费在这段恼人的代码中.我希望有人可以就此事发表一些看法.

非常感谢你.

编辑:我搜索了包含qglobal.h的所有文档,但没有一个使用任何断言函数,所以我不知道什么可能触发这样的错误.没有办法qglobal.h是错误的,所以它必须是源代码的东西.

EDIT2:我设法隔离了触发错误的行,显然编译输出提供了比我想象的更多的信息,但它是如此"分离",我认为这是一个警告,无所事事.这是我的应用程序的代码.两条注释行是触发错误的行.对不起,我错了.

bool ISPSModel::removeGraphics(GraphicsPrimitive* _gtr) {

    for (int _i = 0; _i < ispss.size(); _i++) {

        for (int _j = 0; _j < ispss[_i]->graphicsObjects.size(); _j++) {

            if (ispss[_i]->graphicsObjects[_j] != _gtr)
                continue;

            if (ispss[_i]->graphicsObjects.contains(_gtr)) {

                //beginRemoveRows(indexFromItem(ispss[_i]->m_item), _gtr->getData(DATA_ROLE).value<ISPSItem*>()->row(), _gtr->getData(DATA_ROLE).value<ISPSItem*>()->row());
               //_gtr->getData(DATA_ROLE).value<ISPSItem*>()->remove();
                ispss[_i]->removeGraphics(ispss[_i]->graphicsObjects[_j]);
                endRemoveRows();
                return true;
            }
        }
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

它的这一部分导致了错误:

value<ISPSItem*>()
Run Code Online (Sandbox Code Playgroud)

下面是我忽略的编译错误的另一部分,以防它可以提供帮助:

..........\Qt5\5.2.1\mingw48_32\include/QtCore/qobject.h:实例化'T qobject_cast(QObject*)[with T = ISPSItem*]':.... ......\Qt5\5.2.1\mingw48_32\include/QtCore/qvariant.h:695:51:需要'static T QtPrivate :: QVariantValueHelper :: object(const QVariant&)[with T = ISPSItem*] '..........\Qt5\5.2.1\mingw48_32\include/QtCore/qvariant.h:101:37:需要'static ReturnType QtPrivate :: ObjectInvoker :: invoke(Argument)[with Derived = QtPrivate :: QVariantValueHelper; Argument = const QVariant&; ReturnType = ISPSItem*]'..........\Qt5\5.2.1\mingw48_32\include/QtCore/qvariant.h:810:64:'T qvariant_cast(const QVariant&)[需要T = ISPSItem*]'..........\Qt5\5.2.1\mingw48_32\include/QtCore/qvariant.h:348:36:从'T QVariant :: value()const [需要T = ISPSItem*]'..\marssies\ispswidget.cpp:785:109:从这里需要 EDIT3:我留下了那两行评论并继续迁移应用程序,直到我在另一个文件中得到相同的错误,这是行:

我在另一个.cpp中使用不同的类获得相同的错误,但他们的共同点是 .value<Type>();

Notify* _n = ui.notifyBox->model()->data(index, Qt::UserRole).value<Notify*>();
Run Code Online (Sandbox Code Playgroud)

所以肯定是它.value<Type>();抛出错误的东西,现在唯一剩下的就是找到解决方法.

这是ISPSItem的对象,以防它有用:

class ISPSItem : public QObject {

public:
    enum Level {ROOT_LEVEL = 1,
                    ISPS_LEVEL,
                        GRAPHICS_LEVEL
                    } level;

    ISPSItem(ISPSItem* = NULL, Level = ROOT_LEVEL, int = -1);
    ~ISPSItem();

    ISPSItem* parentItem() {return _parentItem;}

    ISPSItem* child(int);
    void appendChild(ISPSItem*);
    void insertChild(ISPSItem*, int);
    int childCount() const {return children.size();}

    int row() const;
    int newNodeRow(Level);
    void remove();

private:
    QList<ISPSItem*> children;
    ISPSItem* _parentItem;
    void remove(ISPSItem*);
};
Q_DECLARE_METATYPE(ISPSItem*)
Run Code Online (Sandbox Code Playgroud)

vah*_*cho 7

在得到关于错误的大量信息以及触发它的源之后,我得出结论,根本原因可能是QObject在QVariant 中使用子类,尤其是在调用QVariant::value()函数时.正如Qt博士所说:

如果QVariant包含指向从QObject派生的类型的指针,则T可以是任何QObject类型.如果存储在QVariant中的指针可以是qobject_cast到T,则返回该结果.否则返回空指针.请注意,这仅适用于使用Q_OBJECT宏的QObject子类.

我相信,Q_OBJECT在这些classes(ISPSItem)声明中添加宏将解决问题.