成员函数模板

        在同一个模板的不同实例化之间没有继承关系(也不存在隐式转换关系);为什么呢?
        以继承关系为例,当编译器遇到“派生类模板<T>”的定义时,它知道它继承于"基类模板<T>",但是T是一个模板参数,这个直到更迟一些才能被确定当"派生类模板<T>"被实例化的时候。不知道T是什么,就没有办法知道“基类<T>” 是什么样子的。

        为了使具有继承关系(隐式转换关系)的类进行转换,必须在拷贝构造函数或赋值函数中使用“成员函数模板”。
        为了避免不具备转换关系的类型进行转换,通过成员初始化列表,用 cEmpty<U> 持有的类型为 U* 的指针初始化 cEmpty<T> 的类型为 T* 的数据成员。这只有在“存在一个从一个 U* 指针到一个 T* 指针的隐式转换”的条件下才能编译。最终的效果就是 cEmpty<T> 现在有一个泛型化拷贝构造函数,它只有在传入一个"兼容类型"的参数时才能编译。

        成员函数模板是一个极好的东西,它们不会改变语言的基本规则。在一个类中声明一个泛型化拷贝构造函数(一个成员模板)不会阻止编译器生成它们自己的拷贝构造函数(非模板的),所以如果要全面支持拷贝构造,必须既声明一个泛型化拷贝构造函数又声明一个“常规”拷贝构造函数。这同样适用于赋值函数。

        详见代码吧!

#include <iostream>
using namespace std;

template<typename T>
class cEmpty
{
  public:
  cEmpty
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值