前向声明无法按预期进行

时间:2018-12-08 11:01:07

标签: c++ c++11 compiler-errors ros

我正在像这样的头文件“ 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项目中进行编译时,编译器会告诉我

  

错误:未定义的引用   `SpatialCriterionCallback :: subscriberCallbackFunction(neuromorphic_stereo :: MatchingCandidates_ const&)'

当我在“ spatialcriterion.cpp”文件中添加以下行时,它将可以正常编译:

void SpatialCriterionCallback::subscriberCallbackFunction(const neuromorphic_stereo::MatchingCandidates & msg){
  this->matching_candidates.push_back(msg);
}

现在我的问题是:由于函数subscriberCallbackFunction()已经在“ spatialcriterion.h”中声明了,因此如果没有函数定义就不能编译该代码吗?为什么编译器必须定义函数?
我还尝试在此处找到对此行为的解释,但是其他所有有关前向声明失败的帖子(例如thisthis)也不正是我想要的。

1 个答案:

答案 0 :(得分:1)

即使您在类中声明了该方法,它也不存在。

当您在构造函数中引用该函数时,链接器会告诉您它需要知道方法的位置。

代码可以很好地编译,不需要链接