c++ - 具有奇怪类型的成员函数导致回调函数不匹配

标签 c++ ros2

我有一个类,其中的声明和实现都在 .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_camera_subscription 需要回调的签名:

const function<void (const shared_ptr<const sensor_msgs::msg::Image_<allocator<void> > > &)>

但它得到了这个签名

void (viso2_ros::MonoOdometer::*)(const sensor_msgs::msg::Image::ConstSharedPtr &)

这个签名是什么意思? 命名空间::类名::指针 ?为什么不是函数?

(回调签名与他们在文档 https://github.com/ros-perception/image_common/wiki/ROS2-Migration 中使用的签名完全相同,如果有兴趣的话)

最佳答案

该签名意味着它是指向成员函数 的指针,而不是指向函数的常规指针。为了调用 MonoOdometer::imageCallback 它需要类 MonoOdometer 的实例来调用它,但是你的 create_camera_subscription 只是期望它成为一个独立的功能。两种解决方案是将 imageCallback 设为 static 方法,或者传递一个将在其自己的调用中调用 imageCallback 的仿函数(如 lambda)运营商。

静态:

static void imageCallback(...) {
  // ...
}

lambda :

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

关于c++ - 具有奇怪类型的成员函数导致回调函数不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57533219/

相关文章:

C++ 从二进制文件中读回 "incorrect"值?

c++ -/usr/bin/ld : cannot find -lLLVMJIT(and -lLLVMipa) in ubuntu 16. 04

c++ - 3D 建模器(例如搅拌器)如何选择您单击的顶点?

python - ROS图像主题帧率极低

c++ - 如何正确初始化一个事件

c++ - 如何将二进制转换为十进制? (以一种非常简单的方式)

c++ - 运算符重载在 Visual Studio 2013 中编译但不是 gcc

c++ - 启动时在 ros2 中找不到共享运行时库

python - 安装程序应该是本地项目的路径或以 svn+、git+、hg+ 或 bzr+ 开头的 VCS url

c++ - shared_ptr 对象的析构函数从未被调用