8.7.1 定义类模板(2)
看看第6章学过的函数模板语法。因为该函数模板是形参为T的类模板的成员,所以这里的函数模板定义应该有与类模板定义相同的形参。本例中只有一个形参T,但通常可能有好几个。如果类模板有两个或更多形参,则每个定义成员函数的模板也应该有同样多的形参。
注意,作用域解析运算符之前只能使用附带形参名称T的类模板名。这是必需的-- 形参对于识别出根据该模板生成的函数属于哪个类非常重要。类模板的类型是CSamples<T>,其中T是在创建类模板实例时指定的类型。在类模板中插入指定的类型,从而生成类定义。还将其插入函数模板中,从而生成本类中Max()函数的定义。每个根据类模板生成的类都需要有自己的Max()函数定义。
在类模板定义外部定义构造函数或析构函数与此类似。可以将接受样本数组的构造函数的定义写成下面的形式:
- template<class T>
- CSamples<T> ::CSamples(const T values[], int count)
- {
- m_Free = count < maxSamples count : maxSamples; // Don't exceed the array
- for(int i = 0; i < m_Free; i++)
- m_Values[i] = values[i]; // Store count number of samples
- }
我们以定义普通成员函数时使用的相同方式,在模板中指定构造函数属于哪个类。注意,构造函数名不要求形参说明-- 它只能是CSamples,但需要用类模板类型CSamples<T>加以限定。在作用域解析运算符之前只能使用附带形参名称的类模板名。
如果在类定义的外部已经实现了成员函数,它们就必须放在定义类模板的头文件中;它们不能放在.cpp文件中,因为在使用它们时编译器需要找到模板函数的完整实现代码。