You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ROS C++类成员作订阅回调时添加static仍无法解决静态链接错误

报错原因

你遇到的编译报错本质是ROS的subscribe接口和C++非静态类成员函数的调用规则不匹配:

  1. 非静态类成员函数默认携带隐式的this指针参数,和回调要求的参数列表不一致,直接传入函数名无法匹配subscribe的接口要求
  2. 你第二次修改时没有给非静态成员函数加取地址符&,不符合C++成员函数指针的语法要求
  3. 额外隐藏问题:你之前把ros::Subscriber定义为构造函数的局部变量,构造函数执行结束后变量就会被销毁,订阅会直接失效,根本收不到GPS数据

正确修改方案

不需要给receiver函数加static修饰,只需要做两处调整即可:

  1. 在类的私有成员中添加ros::Subscriber类型的成员变量,延长订阅器的生命周期
  2. 构造函数中调用subscribe时,正确传入成员函数指针和当前实例的this指针

修改后的完整代码如下:

头文件部分

#pragma once

#include <sensor_msgs/NavSatFix.h>
#include <ros/ros.h>

class Localization{
public:
    void receiver(const sensor_msgs::NavSatFixConstPtr& data);
    Localization(ros::NodeHandle);
private:
    // 将订阅器设为类成员,避免被销毁
    ros::Subscriber location_sub;
    double latitiude;
    double longitude;
    double altitude;
    const std::string topic {"/mavros/global_position/global"};
};

void Localization::receiver(const sensor_msgs::NavSatFixConstPtr& fix){
    if (fix->status.status == sensor_msgs::NavSatStatus::STATUS_NO_FIX) {
        ROS_INFO("No fix.");
        return;
    }
    latitiude = fix->latitude;
    longitude = fix->longitude;
    altitude = fix->altitude;

    ROS_INFO("Latitude: %f | Longitude: %f | Altitude: %f", latitiude, longitude, altitude);
};

构造函数部分

Localization::Localization(ros::NodeHandle nh){
    // 加&取成员函数地址,传入this指针绑定当前实例
    location_sub = nh.subscribe<sensor_msgs::NavSatFix>(topic, 1, &Localization::receiver, this);
};

额外提示

你代码里的纬度变量名拼写为latitiude,正确拼写是latitude,后续业务逻辑调用变量时注意不要写错。

内容的提问来源于stack exchange,提问作者NotALolicon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:45:04