Простой код
class Base {};
class Derived : Base {};
unique_ptr<Base> Create() {
unique_ptr<Base> basePtr = make_unique<Derived>(); // compile error
return basePtr;
}
выдает ошибку компиляции («нет подходящего преобразования»). Я нашел аналогичный вопрос , где решение заключается в использовании std::move
. Я попробовал это
unique_ptr<Derived> derived = make_unique<Derived>();
unique_ptr<Base> basePtr = std::move(derived); // compile error
но теперь std::move
выдает ошибку компиляции. Я также нашел вопрос , где (если я правильно понял) приведение должно быть автоматическим, если мы используем
unique_ptr<Base> basePtr = make_unique<Derived>(new Derived()); //compile error
но это также не работает (ошибка компиляции), а также не рекомендуется использовать new
с умными указателями.
Какое будет правильное решение?
Единственное рабочее решение, которое я нашел до сих пор
unique_ptr<Base> basePtr = unique_ptr<Base>((Base*)new Derived());
выглядит очень некрасиво.