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