make_shared
не делится существующей вещью;он создает новую совместно используемую вещь, с типом, который вы ей даете.
Это эффективно так (только псевдокод!):
template <typename T>
shared_ptr<T> make_shared(Args...)
{
shared_ptr<T> newPtr = new T(args...);
return newPtr;
}
В этом случае вы создаете Base<int>
, это будет общим.Это не ребенок ничего.Это нарезанная копия вашего Child<int>
.
Ничто в TestClass
не знает, что вы хотели Child<int>
, или даже знает, что Child<int>
существует как тип.
Вы можетевыполните shared_ptr<Base<T>> sptr = &b
, чтобы получить shared_ptr для существующего объекта.К сожалению, указанный объект не выделяется динамически, поэтому он не будет работать хорошо.
Было бы действительно лучше соответствовать семантике владения вашим объектом.Ваша main
функция может выполнить auto ptr = make_shared<Child<int>>()
, а затем передать полученный общий указатель на все, что ожидает shared_ptr<Child<int>>
или shared_ptr<Base<int>>
.
Не зная, что вы на самом деле пытаетесь сделать, я не могувносите более конкретные предложения.