C++ 类型奇怪的成员函数导致回调函数不匹配

C++ 类型奇怪的成员函数导致回调函数不匹配,c++,ros2,C++,Ros2,我有一个类,其中声明和实现位于.cpp文件中。 它有一个名为imageCallback()的成员函数,在构造函数中使用,如下所示 namespace viso2_ros { class MonoOdometer : public rclcpp::Node, public OdometerBase { MonoOdometer(const std::string& transport, const rclcpp::NodeOptions& options) { cam

我有一个类,其中声明和实现位于.cpp文件中。 它有一个名为
imageCallback()
的成员函数,在构造函数中使用,如下所示

namespace viso2_ros {

class MonoOdometer : public rclcpp::Node, public OdometerBase
{
MonoOdometer(const std::string& transport, const rclcpp::NodeOptions& options)
  {
    camera_sub_ = image_transport::create_subscription(this, "image", &MonoOdometer::imageCallback, transport, 1);
  }

protected:
  void imageCallback(
      const sensor_msgs::msg::Image::ConstSharedPtr& image_msg) {
      // implementation of the image callback function
    }
}

} // end namespace
对我来说,这看起来不错,但它不起作用

create\u camera\u订阅
希望回调具有以下签名:

const function<void (const shared_ptr<const sensor_msgs::msg::Image_<allocator<void> > > &)>
这个签名是什么意思<代码>名称空间::类名::指针?为什么它不是一个函数


(如果有兴趣,回调签名与文档中使用的完全相同)

该签名表示它是指向成员函数的指针,而不是指向函数的常规指针。为了调用
MonoOdometer::imageCallback
,需要使用类
MonoOdometer
的实例来调用它,但是您的
create\u camera\u订阅只希望它是一个独立的函数。有两种解决方案,一种是使
imageCallback
成为
static
方法,另一种是传递一个函子(如lambda),该函子将在自己的调用操作符中调用
imageCallback

静态:

static void imageCallback(...) {
  // ...
}
拉姆达:

image_transport::create_subscription(this, "image",
  [&](auto& msg) { this->imageCallback(msg); }, transport, 1);

该签名意味着它是指向成员函数的指针,而不是指向函数的常规指针。为了调用
MonoOdometer::imageCallback
,需要使用类
MonoOdometer
的实例来调用它,但是您的
create\u camera\u订阅只希望它是一个独立的函数。有两种解决方案,一种是使
imageCallback
成为
static
方法,另一种是传递一个函子(如lambda),该函子将在自己的调用操作符中调用
imageCallback

静态:

static void imageCallback(...) {
  // ...
}
拉姆达:

image_transport::create_subscription(this, "image",
  [&](auto& msg) { this->imageCallback(msg); }, transport, 1);