Я столкнулся с этим шаблоном класса интеллектуальных указателей Cptr, показанным частично ниже, и я не понимаю одну из реализаций метода и надеялся получить некоторый вклад. Мой вопрос: «Способ 2», обозначенный ниже. В частности, если Cptr шаблонизирован T, какой синтаксис вызова доступен, что позволяет вызывать метод 2, который, по крайней мере, для меня, является конструктором копирования, но я думал, что конструкторы копирования не являются шаблонами.Templated Class "Copy Constructor"
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», и если да, то каковы его применения? Большое спасибо за ваше время.
Формально копии конструкторов не могут быть шаблонами (** 12.8 [класс.копия] **) – juanchopanza
Хорошо, справедливо; изменил формулировку. –
Неправильное использование. Используется неявное преобразование указателя, а не неявное преобразование самих типов. Поэтому он работает только с иерархией классов. Изменить: вы удалили этот раздел. –