我遇到了下面部分显示的这种模板化的智能指针类Cptr,我不了解其中一种方法的实现,希望获得一些输入。我的问题是关于“方法2”的,标签如下。具体来说,如果Cptr是由T模板化的,则可以使用哪种调用语法来调用“方法2”,至少在我看来,这是一个复制构造函数,但我认为复制构造函数没有模板化。
template <class T> class Cptr
{
public:
/* Constructors ... */
/* Getters ... */
T* ptr() const { return p_; }
long* cnt() const { return cnt_; }
/* Copy Constructors? */
//Method 1
Cptr<T>(const Cptr<T>& i)
: ptr_(i.ptr()), cnt_(i.ptr())
{
std::cout << "M1" << std::endl;
++(*cnt);
}
//Method 2
template <class S> Cptr(const Cptr<S>& i)
: ptr_(i.get()), cnt_(i.cnt())
{
std::cout << "M2" << std::endl;
++(*cnt_);
}
private:
T* p_;
int* cnt_;
};
int main(int argc, char* argv[])
{
CPtr<int> A(new int(5));
CPtr<int> B(A);
std::cout << *(B.get()) << std::endl;
return EXIT_SUCCESS;
}
我设想了对方法2的调用,如下所示:
Cptr<float> B( new float(1.1) );
Cptr<int> A(B); //error for different types
但是对我来说,分配不同类型的指针没有多大意义。有谁遇到过像“方法2”这样的方法定义,如果有的话,有什么用?非常感谢你花时间陪伴。
最佳答案
首先,松散地说,复制构造函数当然可以是模板。从技术上讲,复制构造函数是同一类的另一个实例的构造函数,但是您当然可以定义一个将对另一个类的引用作为参数的构造函数。
但是,您的主要方法的答案是,只要允许隐式类型转换,“ Method2”就可以将智能指针从智能指针分配给其他类:
class Base {};
class Derived : public Base {};
Cptr<Derived> d;
Cptr<Base> b=d; // "Method2" will be used here.
该智能指针实现允许将指向派生类的智能指针分配给指向基类的智能指针。
通常,
Cptr<Base>
和Cptr<Derived>
是两个完全不相关的类。每个模板实例都是一个单独的类。而且,除非可以进行适当的转换,否则通常不能将一个类的实例分配给完全不相关的类的实例。就像可以将派生类的普通指针分配给基类的指针一样,此智能指针提供了可比的功能。