c++ - 前向声明未按预期工作

标签 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项目中进行编译时,编译器告诉我

error: undefined reference to `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)也不是我想要的。

最佳答案

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

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

该代码可以很好地编译,而不是链接

关于c++ - 前向声明未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53681863/

相关文章:

c++ - 如何仅将 C 预处理器应用于某些 (#if/#endif) 指令?

c++ - 程序在索引超出范围时终止

c++ - 特定特化的通用容器的功能

compiler-errors - 针对别名声明的错误10500

compiler-errors - TypeScript : Duplicate identifier in function type

C 文件看不到包含文件中声明的变量

c++ - 在头文件中包含一个巨大的 Vector

c++ - C++ 中的静态 unordered_map 指针初始化

c++ - 在复制构造函数中复制原子的非锁定方式

c++ - 当我在子类中调用函数时,它会调用父类函数