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