因为 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