I'm trying to use a unique_ptr
to derived class in a function that takes a unique_ptr
to a base class. Something like:
class Base {};
class Derived : public Base {};
void f(unique_ptr<Base> const &base) {}
…
unique_ptr<Derived> derived = unique_ptr<Derived>(new Derived);
f(derived);
If I understand this answer correctly, this code should work, but it causes the following compile errors:
error C2664: 'f' : cannot convert parameter 1 from 'std::unique_ptr<_Ty>' to 'const std::unique_ptr<_Ty> &'
IntelliSense: no suitable user-defined conversion from "std::unique_ptr<Derived, std::default_delete<Derived>>" to "const std::unique_ptr<Base, std::default_delete<Base>>" exists
If I change f
to take unique_ptr<Derived> const &derived
, it works fine, but that's not what I want.
Am I doing something wrong? What can I do to work around this?
I'm using Visual Studio 2012.
You have three options:
Give up ownership. This will leave your local variable without access to the dynamic object after the function call; the object has been transferred to the callee:
f(std::move(derived));
Change the signature of f
:
void f(std::unique_ptr<Derived> const &);
Change the type of your variable:
std::unique_ptr<base> derived = std::unique_ptr<Derived>(new Derived);
Or of course just:
std::unique_ptr<base> derived(new Derived);
Or even:
std::unique_ptr<base> derived = std::make_unique<Derived>();
Update: Or, as recommended in the comments, don't transfer ownership at all:
void f(Base & b);
f(*derived);