因為 Q_DECLARE_METATYPE 是一個宏。借用一句話:“宏是萬惡之源”。什么惡呢?就是,如果它的參數當中有逗號",",會被當成參數分隔符。
所以,當你試圖這么寫:
- Q_DECLARE_METATYPE(QMap<QString, bool>);
你就會發現編譯不過,并且抓狂了。
解決方法嘛,當然很簡單:參照Q_DECLARE_METATYPE的宏定義,自己把它展開,編譯器就不會再犯傻了。
- QT_BEGIN_NAMESPACE
- template <>
- 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