之间有什么区别
#define Q_DECLARE_METATYPE(TYPE)
template <>
struct QMetaTypeId< TYPE >
{
...
};
和
#define Q_DECLARE_METATYPE(TYPE)
template <TYPE>
struct QMetaTypeId
{
...
};
第二个定义了一个名为QMetaTypeId
的模板类,其中包含为TYPE
提供的模板参数。一旦声明了这一点,就可以为不同的模板参数定义QMetaTypeId
的专门化。
第一个定义了当模板参数为TYPE
时QMetaTypeId
模板类的专门化。它假设已经存在一个模板类,可以对其进行专门化。
每个示例:
Q_DECLARE_METATYPE2(typename T) //primary template
Q_DECLARE_METATYPE1(int) //specialization for int
QMetaType<int> a; //uses the specialization
QMetaType<float> b; //uses the primary template
第二个版本看起来很奇怪,而第一个版本可能用于让库的用户更容易为自己的类型声明库模板类的专门化。
第一个是显式模板专门化。二是模板定义。
引用文件:
显式专用化只能出现在命名空间范围内,与主模板位于同一命名空间中(如果主模板是成员模板,则显示在最近的封闭命名空间中(,并且它必须出现在非专用化模板声明之后。