gpt4 book ai didi

c++ - unique_ptr 到派生类作为函数的参数,该函数将 unique_ptr 带到基类

转载 作者:IT老高 更新时间:2023-10-28 13:59:24 24 4
gpt4 key购买 nike

我正在尝试使用 unique_ptr到接受 unique_ptr 的函数中的派生类到基类。比如:

class Base {};

class Derived : public Base {};

void f(unique_ptr<Base> const &base) {}



unique_ptr<Derived> derived = unique_ptr<Derived>(new Derived);
f(derived);

如果我理解 this answer正确地,这段代码应该可以工作,但它会导致以下编译错误:

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

如果我更改 funique_ptr<Derived> const &derived ,它工作正常,但这不是我想要的。

我做错了吗?我可以做些什么来解决这个问题?

我正在使用 Visual Studio 2012。

最佳答案

您有三个选择:

  1. 放弃所有权。这将使您的局部变量在函数调用后无法访问动态对象;对象已转移给被调用者:

    f(std::move(derived));
  2. 更改f的签名:

    void f(std::unique_ptr<Derived> const &);
  3. 更改变量的类型:

    std::unique_ptr<base> derived = std::unique_ptr<Derived>(new Derived);

    或者当然只是:

    std::unique_ptr<base> derived(new Derived);

    甚至:

    std::unique_ptr<base> derived = std::make_unique<Derived>();
  4. 更新:或者,按照评论中的建议,根本不要转让所有权:

    void f(Base & b);

    f(*derived);

关于c++ - unique_ptr 到派生类作为函数的参数,该函数将 unique_ptr 带到基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17473900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com