Я использую SFINEA для подписки на общие темы в ROS, который слушает каждую тему и использует SFINEA для возврата header.stamp
времени, если таковой существует. Это значительно ускоряет десериализацию. Единственная проблема: у меня проблема с настройкой моего подписчика. Я получаю следующую компиляции ошибка:Ошибка шаблона SFINAE
CMakeFiles/performance_tracker.dir/src/performance_tracker.cpp.o:
In function PerformanceTracker::topicCallback(boost::shared_ptr<topic_tools::ShapeShifter>)
ros/src/performance_tracker/src/performance_tracker.cpp:32:
undefined reference to boost::disable_if<timewarp::has_header<boost::shared_ptr<topic_tools::ShapeShifter> >, ros::Time>::type
timewarp::extractTime<boost::shared_ptr<topic_tools::ShapeShifter> >(boost::shared_ptr<topic_tools::ShapeShifter>)
Главная
// Subscribe To Generic Message
_sub = _nh.subscribe(_topicName, 1, &PerformanceTracker::topicCallback, this);
void PerformanceTracker::topicCallback(const boost::shared_ptr<topic_tools::ShapeShifter> data){
//Current Time
ros::Time begin = ros::Time::now();
ros::Time timePublished = timewarp::extractTime<boost::shared_ptr<topic_tools::ShapeShifter>>(data);
}
NAMESPACE КЛАСС
namespace timewarp
{
template <typename T>
struct has_header {
typedef char yes[1];
typedef char no[2];
template <typename C>
static yes& test(typename C::_header_type*);
template <typename>
static no& test(...);
// If the "sizeof" the result of calling test<T>(0) would be equal to the sizeof(yes),
static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};
template<class MsgType>
typename boost::enable_if<has_header<MsgType>, ros::Time>::type extractTime(const boost::shared_ptr<topic_tools::ShapeShifter> data)
{
boost::shared_ptr<MsgType> ptr = data->instantiate<MsgType>();
assert(ptr);
return ptr->header.stamp;
}
template<class MsgType>
typename boost::disable_if<has_header<MsgType>, ros::Time>::type extractTime(const boost::shared_ptr<topic_tools::ShapeShifter>);
}
Это имеет смысл, но я ставлю 'повышение :: shared_ptr < topic_tools :: ShapeShifter> 'как тип данных в моем методе SFINAE, так почему бы пропустить общую тему« topic_tools :: ShapeShifter »? – DaynaJuliana
Также второй возвращает ошибку: ожидаемое первичное выражение перед const ros :: Time timePublished = timewarp :: extractTime (const boost :: shared_ptr & data); ' –
DaynaJuliana
И первый возвращает тот же самый ошибка. Это проблема связи? – DaynaJuliana