ошибка «нет соответствия для вызова» с использованием boost :: bind

#c #boost-bind

#c #boost-привязка

Вопрос:

Я все еще новичок в boost :: bind и теперь переношу программу, которая была написана 2 года назад в 2009 году, видя ошибку компиляции ниже. Любая идея по обходному пути будет оценена.

Извлеченный cpp-файл:

 class ClassA {
private:
    cNamespace::Bounds bounds_msg_;

    void boundsHandler(const PublisherPtramp; p) { 
        p->publish(bounds_msg_);
    }

    void funcA() {
        node_->advertise<cNamespace::Bounds>("bounds", 10,
              boost::bind(amp;ClassA::boundsHandler, this, _1));  // <---- Line 445
    }
};
  

Ошибка при CMake:

 /home/userA/ClassA.cpp:445:   instantiated from here
/usr/include/boost/bind/bind.hpp:313: error: no match for call to ‘(boost::_mfi::mf1<void, ClassA, const PublisherPtramp;>) (ClassA*amp;, const ros::SingleSubscriberPublisheramp;)’
  

Среда: Ubuntu 10.10, g (Ubuntu / Linaro 4.4.4-14ubuntu5) 4.4.5

Может и не понадобиться, но ссылка на API функции advertise здесь, или:

 template<class M >
Publisher   advertise (const std::string amp;topic, 
                       uint32_t queue_size, 
                       const SubscriberStatusCallback amp;connect_cb, 
                       const SubscriberStatusCallback amp;disconnect_cb=SubscriberStatusCallback(),
                       const VoidConstPtr amp;tracked_object=VoidConstPtr(), 
                       bool latch=false)
  

Ответ №1:

Похоже, что объект функции, который создается, boost::bind вызывается с другим типом, чем функция, которую вы связали.

т.е. он вызывается с const ros::SingleSubscriberPublisheramp; аргументом вместо ожидаемого const PublisherPtramp; p .

Предполагая SubscriberStatusCallback , что это a boost::function , вы должны убедиться, что его аргумент соответствует тому, который вы связали.