无法使用std :: unique_ptr初始化指针

aik*_*khs 1 c++ new-operator unique-ptr c++14

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

std::unique_ptr<tf::TransformBroadcaster> tfb_;
Run Code Online (Sandbox Code Playgroud)

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

tfb_ = std::make_unique<tf::TransformBroadcaster>(new tf::TransformBroadcaster());
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

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

根据我的理解,即使我没有(或者可能是?),我似乎也想通过一个论点。头文件tf::TransformBroadcaster没有什么特别的(只是一个片段):

class TransformBroadcaster{
public:
  /** \brief Constructor (needs a ros::Node reference) */
  TransformBroadcaster();
Run Code Online (Sandbox Code Playgroud)

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

tf::TransformBroadcaster* tfb_;
Run Code Online (Sandbox Code Playgroud)

在我的构造函数中:

tfb_ = new TransformBroadcaster()
Run Code Online (Sandbox Code Playgroud)

而且有效。知道为什么吗?

Ded*_*tor 6

由于没有构造函数TransformBroadcaster接受a TransformBroadcaster*作为输入,因此无法std::make_unique<TransformBroadcaster>()使用此类参数进行调用。

简而言之,此行:

tfb_ = std::make_unique<tf::TransformBroadcaster>(new tf::TransformBroadcaster());
Run Code Online (Sandbox Code Playgroud)

应该是这样的:

tfb_ = std::make_unique<tf::TransformBroadcaster>();
Run Code Online (Sandbox Code Playgroud)

  • @aikhs`make_unique` *总是*指向新实例的指针。您只需为其提供要用于构造该实例的参数即可。 (3认同)