2016-02-14 1 views
0

Я использую 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>); 

} 

ответ

1

Вы передаете boost::shared_ptr<topic_tools::ShapeShifter> типа, как MsgType к has_header<T> вместо topic_tools::ShapeShifter.

Я считаю, что вы хотите сделать:

ros::Time timePublished = timewarp::extractTime<topic_tools::ShapeShifter>(data); 

И использовать константные REFS аргументы, а вы на это :)

template<class MsgType> 
typename boost::enable_if<has_header<MsgType>, ros::Time>::type extractTime(const boost::shared_ptr<MsgType>& 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<MsgType>&) 
{ 
    return ros::Time::now(); 
    // or whatever ros time you need to return for types without headers 
} 
} 
+0

Это имеет смысл, но я ставлю 'повышение :: shared_ptr < topic_tools :: ShapeShifter> 'как тип данных в моем методе SFINAE, так почему бы пропустить общую тему« topic_tools :: ShapeShifter »? – DaynaJuliana

+0

Также второй возвращает ошибку: ожидаемое первичное выражение перед const ros :: Time timePublished = timewarp :: extractTime (const boost :: shared_ptr & data); ' – DaynaJuliana

+0

И первый возвращает тот же самый ошибка. Это проблема связи? – DaynaJuliana