我在头文件“spatialcriterion.h”中定义了一个SpatialCriterionCallback
类,如下所示:
#include "ros/ros.h"
#include "neuromorphic_stereo/MatchingCandidates.h"
#include <vector>
class SpatialCriterionCallback
{
public:
// constructors & destructors
SpatialCriterionCallback()=default;
SpatialCriterionCallback(ros::NodeHandle);
~SpatialCriterionCallback()=default;
private:
std::vector<neuromorphic_stereo::MatchingCandidates> matching_candidates;
void subscriberCallbackFunction(constneuromorphic_stereo::MatchingCandidates&);
}
然后,在文件“spatialcriterion.cpp”中,我定义了一个调用ros::SubscriberNode的构造函数,如下所示:
#include "spatialcriterioncallback.h"
SpatialCriterionCallback::SpatialCriterionCallback(ros::NodeHandle n)
{
this->n =n;
this->time_criterion_topic_handle = this->n.subscribe("TimeCriterionTopic",
1e4,
&SpatialCriterionCallback::subscriberCallbackFunction,
this);
}
当我尝试在qtcreator项目中进行编译时,编译器告诉我
当我将以下行添加到“spatialcriterion.cpp”文件中时,它将可以正常编译:
void SpatialCriterionCallback::subscriberCallbackFunction(const neuromorphic_stereo::MatchingCandidates & msg){
this->matching_candidates.push_back(msg);
}
现在我的问题是:如果没有在函数定义中编译该代码,因为函数
subscriberCallbackFunction()
已经在“spatialcriterion.h”中声明了?为什么编译器必须定义函数?我还尝试在此处找到对此行为的解释,但是其他所有关于前向声明失败的帖子(例如this或this)也不是我想要的。
最佳答案
即使您在类中声明了该方法,该方法也不存在。
当在构造函数中引用该函数时,链接器会告诉您它需要知道该方法在哪里。
该代码可以很好地编译,而不是链接。