Прежде всего, вы берете аргумент в baz
значением , что подразумевает копирование a std::unique_ptr
и ... это невозможно (или std::move
но я сомневаюсь, что это то, что вам нужно).
Во-вторых, std::unique_ptr
не конвертируется, потому что это потребует копирования.
Какой обходной путь?
Вы можете сделать:
std::unique_ptr<Foo<int>> up = std::make_unique<Bar>();
вместо:
auto up = std::make_unique<Bar>();
и взять аргумент в baz
по ссылке :
void baz(std::unique_ptr<Foo<int>>&) { ... }
Первым делом нужно сохранить unique_ptr
в производной от unique_ptr
базы.auto
не может этого сделать, если вы не используете приведение.
Во-вторых, как уже упоминалось, не копируйте unique_ptr
.
Более того, выкод демонстрирует неопределенное поведение , потому что вы удаляете объект производного класса с указателем базового класса.Для этого требуется базовый класс virtual
.