real pointers(真正的指针)做得很好的一件事是支持 implicit conversions(隐式转换)。derived class pointers(派生类指针)隐式转换到 base class pointers(基类指针),pointers to non-const objects(指向非常量对象的指针)转换到 pointers to const objects(指向常量对象的指针),等等。例如,考虑在一个 three-level hierarchy(三层继承体系)中能发生的一些转换: class Top { ... }. class Middle: public Top { ... }. class Bottom: public Middle { ... }. Top *pt1 = new Middle. // convert Middle* => Top* Top *pt2 = new Bottom. // convert Bottom* => Top* const Top *pct2 = pt1. // convert Top* => const Top* 在 user-defined smart pointer classes(用户定义智能指针类)中模仿这些转换是需要技巧的。我们要让下面的代码能够编译: template class SmartPtr { public: // smart pointers are typically explicit SmartPtr(T *realPtr). // initialized by built-in pointers ... }.
大体上,我们需要的 constructors(构造函数)的数量是无限的。因为一个 template(模板)能被实例化而产生无数个函数,所以好像我们不需要为 SmartPtr 提供一个 constructor function(构造函数函数),我们需要一个 constructor template(构造函数模板)。这样的 templates(模板)是 member function templates(成员函数模板)(常常被恰如其分地称为 member templates(成员模板))——生成一个 class 的 member functions(成员函数)的 templates(模板)的范例: template class SmartPtr { public: template // member template SmartPtr(const SmartPtr &. other). // for a "generalized ... // copy constructor" }.