std::unique_ptr
- это шаблон класса , а не шаблон function .Вывод аргумента происходит только для шаблонов function , а не шаблонов class .
Обычно используется трюк - написать шаблон функции, который создает объект типа шаблона экземпляра класса, например:
template <typename T>
std::unique_ptr<T> make_unique_ptr(T* ptr)
{
return std::unique_ptr<T>(ptr);
}
Для std::unique_ptr
, однако, я бы избегалвыполняя это: объект std::unique_ptr
должен непосредственно вступать во владение динамически размещенным объектом, поэтому в этом не должно быть необходимости.Ваш код должен быть записан как:
std::unique_ptr<A> a(new A());
или, если a
уже существует, можно использовать вызов reset()
:
a.reset(new A());
Что касаетсяпочему вывод типа не будет работать для создания экземпляра шаблона класса, рассмотрим следующий пример:
template <typename T>
struct X
{
template <typename U> X(U) { }
};
Нет способа, которым T
мог бы быть выведен из вызова конструктора.Даже в «более простых» случаях, когда имеется конструктор с параметром типа T
, могут возникнуть проблемы, поскольку конструкторы могут быть перегружены.