在类模板外部定义成员函数
在前面的学习过程中,类模板的成员函数都是在类的内部实现的,类模板的成员函数可以在类模板的定义中定义(inline函数),也可以在类模板定义之外定义(此时成员函数定义前面必须加上template及模板参数),在类模板外部定义成员函数的方法如下所示:
template<模板形参表>
函数返回类型 类名<模板形参名>::函数名(参数列表){}
template是类模板的声明,在实现成员函数时,也要加上类作用域,而且在类名后要用<>指明类的模板形参。例如有下列类模板的定义:
template<typename T1, typename T2>
class B
{
public:
T1 a;
T2 b;
T1 func(T1 a, T2& b);
};
上述代码中,如果在类模板外定义类B的成员函数func(),其实现如下所示:
template<typename T1, typename T2>
T1 B<T1,T2>::func(T1 a, T2& b){}
类模板成员函数本身也是一个模板,类模板被实例化时它并不自动被实例化,只有当它被调用或取地址时,才被实例化。需要注意的是当在类外面定义类的成员函数时,template后面的模板形参应与要定义的类模板形参一致。
为了读者更好的掌握在类模板外定义其成员函数,接下来我们通过一个小案例来演示在类模板外定义类的成员函数,具体代码如例1所示。
例1
1 #include <iostream>
2 using namespace std;
3 template<typename T> //类模板
4 class Array
5 {
6 private:
7 int size;
8 T* ptr;
9 public:
10 Array(T arr[], int s);
11 void show();
12 };
13 template<typename T> //类模板外定义其成员函数
14 Array<T>::Array(T arr[], int s)
15 {
16 ptr = new T[s];
17 size = s;
18 for (int i = 0; i < size; i++)
19 {
20 ptr[i] = arr[i];
21 }
22 }
23 template<typename T> //类模板外定义其成员函数
24 void Array<T>::show()
25 {
26 for (int i = 0; i < size; i++)
27 cout << *(ptr + i) << " ";
28 cout << endl;
29 }
30 int main()
31 {
32 char cArr[] = { 'a', 'b', 'c', 'd', 'e' };
33 Array<char> a1(cArr, 5); //创建类模板的对象
34 a1.show();
35
36 int iArr[10] = { 1, 2, 3, 4, 5, 6 };
37 Array<int> a2(iArr, 10);
38 a2.show();
39 system("pause");
40 return 0;
41 }
运行结果如图1所示。
图1 例1运行结果
在例1中,类Array的构造函数有一个数组类型参数,则在创建类对象时,第一个对象用char类型的数组去初始化,第二个对象用int类型的数组去初始化,然后调用show()函数,两个数组的结果都成功输出。
注意:类模板在实例化时,带有模板形参的成员函数并不会跟着实例化,这些成员函数只有在被调用时才会被实例化。