【问题标题】:Cannot initialize a pointer using std::unique_ptr无法使用 std::unique_ptr 初始化指针
【发布时间】:2019-08-27 20:27:17
【问题描述】:

我的类中有一个对象,并且我已经声明了该对象而没有进行任何初始化:

std::unique_ptr<tf::TransformBroadcaster> tfb_;

然后,在构建过程中,我决定初始化我的tfb_

tfb_ = std::make_unique<tf::TransformBroadcaster>(new tf::TransformBroadcaster());

我收到一个错误:

error: no matching function for call to ‘tf::TransformBroadcaster::TransformBroadcaster(tf::TransformBroadcaster*)’
     { return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...)); }

根据我的理解,即使我不是(或者可能是?),我似乎也在尝试传递一个论点。 tf::TransformBroadcaster的头文件没什么特别的(只是一个sn-p):

class TransformBroadcaster{
public:
  /** \brief Constructor (needs a ros::Node reference) */
  TransformBroadcaster();

我尝试在头文件中使用原始指针:

tf::TransformBroadcaster* tfb_;

在我的构造函数中:

tfb_ = new TransformBroadcaster()

它奏效了。知道为什么吗?

【问题讨论】:

  • @JesperJuhl 我不清楚你的意思,但我解释为 std::unique_ptr 必须初始化为一些值,如引用。但是std::unique_ptr 有一个默认构造函数,它使用nullptr 构造它。
  • @JesperJuhl A unique_ptr 可以默认构造,然后通过其reset()operator= 分别使用指针初始化。

标签: c++ c++14 new-operator unique-ptr


【解决方案1】:

由于没有将TransformBroadcaster* 作为输入的TransformBroadcaster 的构造函数,因此您不能使用这样的参数调用std::make_unique&lt;TransformBroadcaster&gt;()

简而言之,这一行:

tfb_ = std::make_unique<tf::TransformBroadcaster>(new tf::TransformBroadcaster());

应该是这样的:

tfb_ = std::make_unique<tf::TransformBroadcaster>();

【讨论】:

  • 那么,如果我不将任何参数传递给make_unique,它会自己创建一个指针实例吗?
  • 是的,() 中的部分是您要为其创建智能指针的类型的构造函数的参数。 tfb_ = std::make_unique&lt;tf::TransformBroadcaster&gt;() 将使用默认构造函数。
  • @aikhs make_unique always 创建一个指向新实例的指针。你只需给它你希望它用来构造那个实例的参数。
  • @aikhs 你从不newstd::make_unique()一起使用。如果你想使用new,它需要看起来像这样:tfb_ = std::unique_ptr&lt;tf::TransformBroadcaster&gt;(new tf::TransformBroadcaster);tfb_.reset(new tf::TransformBroadcaster); 不过使用make_unique() 更安全。
猜你喜欢
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 2018-08-01
  • 2017-04-04
相关资源
最近更新 更多