我有一个类,其中的声明和实现都在 .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/