Почему классы, подобные shared_ptr
, имеют в своих конструкторах другой шаблон?
Например:
template<class T> class shared_ptr {
public:
template<class Y>
explicit shared_ptr(Y * p);
Я читал Scott Meyers Effective С++, пункт 45, в котором говорится, что идея заключается в том, чтобы сделать возможным их полиморфизм; т.е. построить shared_ptr<A>
из shared_ptr<B>
, если B получен из A.
Но не определяет конструктор типа
explicit shared_ptr(T * p);
достаточно? Я имею в виду, этот код работает очень хорошо:
class C1 {
};
class C2 : public C1 {
};
template<typename T>
class A
{
public:
A(T &a)
{
var1 = a;
}
T var1;
};
int main(int argc, char *argv[])
{
C2 c2;
A<C1> inst1(c2);
}
Итак, зачем нам нужен еще один шаблон для конструктора?