首先看代码,静态数据成员分为两种情况,第一种不依赖模版类型参数,第二种依赖模版类型参数。
template <typename T> class TestTemStatic { public: static int knownTypeVar; static T unKnownTypeVar; };
对于第一种存在两种初始化方式:
template <> int TestTemStatic<int/* any other type */>::knownTypeVar=2;//具化定义,给出T类型,同时定义num,T可以是其他任意特定类型。 template <typename T> int TestTemStatic<T>::knownTypeVar=50;//范化定义,定义num时不需要知道T的类型
两种初始化可以并存,对于特定类型T如果存在具化定义,则以具化定义为准。并且对于特定类型T的具化定义不可在不同的(CPP)实现文件中重复。
//a.cpp template <typename T> int TestTemStatic<T>::knownTypeVar=50; //b.cpp template <typename T> int TestTemStatic<T>::knownTypeVar=60;
因此,范化定义可以放在头文件中,具化定义放在唯一的cpp文件中。
对于第二中只有一种初始化方式:
template <> float TestTemStatic<float>::unKnownTypeVar=4.0f;由于unKnowTypeVar的定义依赖模版参数T的类型,所以定义unKnownTypeVar时必须给出T的类型。同样,对于特定类型T的具化定义不可在不同的(CPP)实现文件中重复。
作者水平有限,平时不怎么接触模版,如果错误请指正。
原文地址:http://blog.csdn.net/zjq2008wd/article/details/38417859