C ++ Когда вывод шаблона не удается - PullRequest
5 голосов
/ 03 апреля 2011

Почему C ++ не может определить, что я собираюсь создать unique_ptr<A> с этим синтаксисом?(a ранее был объявлен как unique_ptr<A>)

a = unique_ptr(new A());

Кажется ужасно избыточным включать <A>.Это работает для большинства шаблонов функций, которые я использую, почему бы не unique_ptr?

EDIT: C ++ теперь поддерживает make_unique без избыточности.

1 Ответ

10 голосов
/ 03 апреля 2011

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, могут возникнуть проблемы, поскольку конструкторы могут быть перегружены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...