Я пытаюсь использовать boost :: bind с boost :: function, но появилась ошибка компиляции.
почему нельзя привязать заполнитель к объекту функции?
void fun_1(const boost::system::error_code& error)
{
std::cout<<"test_1------------"<<std::endl;
}
void fun_2(int i)
{
std::cout<<"tset_2------------"<<std::endl;
}
int main(void)
{
boost::function0<void> fobj;
//fobj = boost::bind(&fun_1,boost::asio::placeholders::error);//compile failed
fobj = boost::bind(&fun_2,5);//syntax is ok
return 0;
}
Замечания:
глядя на http://my.oschina.net/yellia/blog/90678, автор объясняет реализацию boost :: bind просто и понятно. Я надеюсь, что это поможет вам. 哈哈
Ваши подписи не совпадают. Попробуй это:
#include <boost/function.hpp>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
void fun_1(const boost::system::error_code& error)
{
std::cout<<"test_1------------"<<std::endl;
}
void fun_2(int i)
{
std::cout<<"tset_2------------"<<std::endl;
}
int main(void)
{
boost::function<void (const boost::system::error_code&)> fobj;
fobj = boost::bind(&fun_1,boost::asio::placeholders::error);
return 0;
}
Компиляция проверена под GCC с g++ main.cpp -lboost_system -lpthread
Для дальнейшего использования, это помогает добавить
при публикации фрагментов, подобных приведенным выше, чтобы спасти людей, которые хотят помочь вам время.
Если вы не можете изменить подпись, вам нужно передать значение для error_code
связывать вместо заполнителя, чтобы он мог предоставляться при вызове функции
т.е .:
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/asio.hpp>
#include <boost/system/error_code.hpp>
void fun_1(const boost::system::error_code& error)
{
std::cout<<"test_1------------"<<std::endl;
}
void fun_2(int i)
{
std::cout<<"tset_2------------"<<std::endl;
}
int main()
{
boost::function0<void> fobj;
//fobj = boost::bind(&fun_1,boost::asio::placeholders::error);//compile failed
fobj = boost::bind( &fun_1,
boost::system::errc::make_error_code( boost::system::errc::success ) );//compiles ok
// fobj = boost::bind(&fun_2,5);//syntax is ok
return 0;
}