模板杂记(一)

模板类中的友元的类外实现时,使用类的内部类声明变量时的格式:

 1 template <typename T>
 2 class A
 3 {
 4 public:
 5 private:
 6 class B//声明一个内部类 
 7 {
 8 public:
 9 B(void):c(10){}
10 T c;
11 friend ostream& operator<< (ostream& os,const B& b)//内部重载<<,以利于外部使用
12 {
13 return os<<b.c;
14 }
15 };
16 template <typename T1>//内部的模板声明,不能用T,会和类外的T重复,报错
17 friend ostream& operator<< (ostream& os,const A<T1>& a);//友元函数声明中的A<T1>& 中的T1不能换做T,这好像就是一个友元函数的模板,与class A模板类无关
18 };
19 template <typename T>//外部实现时必须为模板
20 ostream& operator<< (ostream& os,const A<T>& a)
21 {
22 typename A<T>::B b;//访问内部类时必须使用typename,告诉编译器A<T>是一个模板类
23 return os<<b;
24 // typename T::B b;
25 }

 

 

下面的代码中Y可以是一个模板类:

 1 template<typename X, typename Z,
 2 template<typename T> class Y>
 3 class B {
 4 public:
 5 B (const X& i, const Z& s) :
 6 m_i (i), m_s (s) {}
 7 Y<X> m_i;//一个模板类声明的对象作为另一个模板类的成员变量
 8 Y<Z> m_s;
 9 };
10 
11  

 

模板类的继承示意:

 1 class A {
 2 public:
 3 A (const T& t) : m_t (t) {}
 4 T m_t;
 5 };
 6 template<typename T, typename Y>
 7 class B : public A<T> {//注意继承时基类的格式
 8 public:
 9 B (const T& t, const Y& y) :
10 A<T> (t), m_y (y) {}//与普通的继承相同,构造时应该初始化基类
11 Y m_y;
12 };

 

 

下面代码中的子类模板,可以滞后于父类的构造:

 

 1 template<typename BASE>
 2 class Shape : public BASE {//继承于一个不确定的基类
 3 public:            //只有在子类实例化后才能确定基类,才会有这样的特例
 4 void draw (void) const {
 5 BASE::draw ();
 6 }
 7 };
 8 class Rect {
 9 public:
10 void draw (void) const {
11 cout << "绘制矩形..." << endl;
12 }
13 };
14 class Circle {
15 public:
16 void draw (void) const {
17 cout << "绘制圆形..." << endl;
18 }
19 };

 

所有代码的测试环境为ubuntu12.04下的g++编译器

转载于:https://www.cnblogs.com/huohongbin/p/3700263.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值