标签:
首先看看下面的真实的指针与模板创建的智能指针之间的区别:
1 class Top{...}; 2 class Middle : public Top{...}; 3 class Bottom : public Middle{...}; 4 Top * p1 = new Bottom(); 5 Top * p2 = new Middle(); 6 const Top * cp2 = p1; //ok,没有问题,指针与实际所指之物之间确实是有关系的
但是:
1 template<typename T> 2 class SmartPtr{ 3 public: 4 explicit SmartPtr(T * ptr); 5 ... 6 }; 7 SmartPtr<Top> pt1 = SmartPtr<Middle>(new Middle); 8 SmartPtr<Top> pt2 = SmartPtr<Bottom>(new Bottom); 9 SmartPtr<const Top> cp2 = pt1;
这里的等式左右两边的真正实际并没有任何的关系,只是同一个模板实例化出来的不同模板实例而已。
1 template<typename T> 2 class SmartPtr{ 3 public: 4 template<typename U> 5 SmartPtr(const SmartPtr<U> &other); 6 ... 7 };
上面这个SmartPtr的构造函数并非是explicit的,因为默认的指针之间可以隐式的相互转换,所以将这点引申到智能指针之上也是无可厚非的。
1 template<typename T> 2 class SmartPtr{ 3 public: 4 template<typename U> 5 SmartPtr(const SmartPtr<U> &other) 6 : heldPtr(other.get()){...} 7 T*get() const{return heldPtr;} 8 ... 9 private: 10 T * heldPtr; 11 };
标签:
原文地址:http://www.cnblogs.com/-wang-cheng/p/4889818.html