Форвардная декларация не работает должным образом - PullRequest
0 голосов
/ 08 декабря 2018

Я определяю класс SpatialCriterionCallback в файле заголовка "atialcriterion.h "следующим образом:

#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&);
}

Затем в файле "atialcriterion.cpp" я определяю конструктор, который вызываетa 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 &) '

Когда я добавлю следующие строки в мой файл "atialcriterion.cpp ", он будет прекрасно скомпилирован:

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

Теперь мой вопрос: Не должен ли этот код скомпилироваться без определения функции, потому что функция subscriberCallbackFunction() уже была объявлена ​​в "atialcriterion.h "?Почему компилятору необходимо определить функцию?
Я также попытался найти объяснение этому поведению здесь, но все остальные посты о неудачном объявлении (например, this или this) не совсем то, что я ищу.

1 Ответ

0 голосов
/ 08 декабря 2018

Даже если вы объявили метод в своем классе, он не существует.

Когда вы ссылаетесь на эту функцию в конструкторе, компоновщик сообщает вам, что ему нужно знать, гдеметод.

Код компилируется нормально, он не ссылка .

...