12.4.2 对象成员模板
类模板的定义可以放在另一个类中,实例化后的模板类对象可以作为另一个类的成员,如示例代码12.10所示。
代码12.10 对象成员模板ObjectMemberTemplate
<———————————-文件名:example1210.cpp———————————————> 01 #include<iostream> 02 using namespace std; 03 template<class T> 04 class Outside//外部Outside类定义 05 { 06 07 public: 08 template<class R> 09 class Inside//嵌套类模板定义 10 { 11 private: 12 R r; 13 public: 14 Inside(R x)//模板类的成员函数可以在定义时实现 15 { 16 r=x; 17 } 18 void disp(); 19 }; 20 Outside(T x):t(x) 21 { 22 } 23 void disp(); 24 private: 25 Inside<T>t; 26 }; 27 28 template<class T> 29 template<class R> 30 void Outside<T>:Inside<R>:disp()//模板类的成员函数也可以在定义外实现 31 { 32 cout<<"Inside:"<<Outside<T>:Inside<R>:r<<endl; 33 } 34 template<class T> 35 void Outside<T>:disp() 36 { 37 cout<<"Outside:"; 38 t. disp(); 39 } 40 int main() 41 { 42 Outside<int>:Inside<double>obin(3. 5);//声明Inside类对象obin 43 obin. disp(); 44 Outside<int>obout(2);//创建Outside类对象obout 45 obout. disp(); 46 return 0; 47 }
输出结果如下所示。
Inside:3.5 Outside:Inside:2
【代码解析】理解的难点在于“类模板不等于类定义,需要实例化或特化来生成类实例”。代码第9行的Inside类模板的访问权限为public,因此,可以调用下述语句。
“Outside<int>:Inside<double>obin(3.5);”
在Outside类内使用“Inside<T>t;”语句声明了Inside<T>类的对象,在Outside模板类对象创建时,首先采用隐式实例化生成Inside<T>类的定义,其次再根据此定义创建对象成员t。