Q_DECLARE_METATYPE 的一个坑(有时候会现诡异编译错误)

来源:互联网 发布:k均值聚类算法实例 编辑:程序博客网 时间:2024/05/17 21:57

因为 Q_DECLARE_METATYPE 是一个宏。借用一句话:“宏是万恶之源”。什么恶呢?就是,如果它的参数当中有逗号",",会被当成参数分隔符。


所以,当你试图这么写:

Q_DECLARE_METATYPE(QMap<QString, bool>);

你就会发现编译不过,并且抓狂了。


解决方法嘛,当然很简单:参照Q_DECLARE_METATYPE的宏定义,自己把它展开,编译器就不会再犯傻了。


QT_BEGIN_NAMESPACEtemplate <>struct QMetaTypeId< QMap<QString, bool> >{    enum { Defined = 1 };    static int qt_metatype_id()    {        static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0);        if (!metatype_id)            metatype_id = qRegisterMetaType< QMap<QString, bool> >("QMap<QString, bool>",                reinterpret_cast< QMap<QString, bool> *>(quintptr(-1)));        return metatype_id;    }};QT_END_NAMESPACE