当两个成员都在同一个类中时,出现错误“非静态成员引用必须相对于特定对象”

Posted

技术标签:

【中文标题】当两个成员都在同一个类中时,出现错误“非静态成员引用必须相对于特定对象”【英文标题】:Getting error "a nonstatic member reference must be relative to a specific object" while both member are in the same class 【发布时间】:2018-07-27 09:45:49 【问题描述】:

我知道这个问题已被问过很多次,但我仍然卡住了。我以为我明白了这个错误是什么,显然我没有。

所以,我得到的错误是

a nonstatic member reference must be relative to a specific object

我的代码是:

class theTranslator 
public:
    ros::NodeHandle nh;

    ros::Publisher pub = nh.advertise<sensor_msgs::Image>("camera/depth/image_raw", 100);

    static void getMessage(const sensor_msgs::Image::ConstPtr& recMmsg) 
        ROS_INFO( "I heard message" );
        pub.publish(recMmsg); //*** ERROR IS HERE ***
    
;

由于pubgetMessage() 属于同一类,它不应该工作吗?如何让static 成员函数使用同一类的变量成员?

附:这是在 ROS(机器人操作系统)中完成的,但我认为这是一个 C++ 错误(与 ROS 无关)。

【问题讨论】:

编译器如何知道要使用哪个对象的 pub 成员?您必须发送例如指向实际 theTranslator 对象的指针或引用作为 getMessage 的参数,并访问该实例的 pub 成员。但通常情况下,静态成员 fcns 只访问静态数据。 【参考方案1】:

在 C++ 中,您不能从静态方法访问非静态类成员。让它成为一个正常的方法,然后尝试如下:-

 void getMessage(const sensor_msgs::Image::ConstPtr& recMmsg)
        ROS_INFO( "I heard message" );
        pub.publish(recMmsg); //*** ERROR IS HERE ***
    

否则将 pub 声明为静态成员

static ros::Publisher pub; 

也可以参考下面的答案

C++ static member functions and variables

【讨论】:

那太糟糕了。我想如果他们在同一个班级,那是正确的。以我目前的设计,我无法按照您的建议进行操作。回到我猜的白板。谢谢。【参考方案2】:

您需要将getMessage 设为非静态或将pub 设为静态。

您真正需要做的可能是重新考虑您的设计。你为什么要让getMessage 静态化?作为一个非常普遍的经验法则,静态是一个错误,尤其是对于新手。

【讨论】:

与ROS如何处理节点间的消息传输有关。你是对的,我需要重新设计我的代码。谢谢。 @DimitrisPantelis 通常将成员函数设为静态的动机是因为您需要将其用作回调。这是一个众所周知的问题,如何从回调函数获取对象。一些谷歌搜索可能会有所帮助。 其实这就是我想要的,用它作为回调。将谷歌它。

以上是关于当两个成员都在同一个类中时,出现错误“非静态成员引用必须相对于特定对象”的主要内容,如果未能解决你的问题,请参考以下文章

当我将模板类与非模板类放在同一个 cpp 文件中时出现链接错误 - C++

当多个警报视图出现在同一个视图控制器中时,有没有办法交错?

当标识字段位于两个单独的列中时,如何检索该特定记录的最新出现? [关闭]

当 UICollectionViewCell 在 xib 中时连接插座出现问题

当所有参数都在设备内存中时如何调用 cuSparse?

错误的模糊应用(类继承问题)