不能从 ‘void (a_timer::*)(const boost::system::error_code&)’ 转换到 ‘int’

时间:2022-09-08 23:26:18
各位大侠,小弟编写代码如下,编译报错,请问是什么原因,并求解决办法:

class a_timer
{
private:
int count;
int count_max;
function<void()> f;
deadline_timer t;

public:
template<typename F>
a_timer(io_service& ios,int x,F func):
f(func),count_max(x),count(0),
t(ios,posix_time::millisec(500))
{
t.async_wait(bind(&a_timer::call_func,
this,placeholders::error));
}
void call_func(const boost::system::error_code&)
{
if(count >= count_max){
return;
}
++count;
f();
t.expires_at(t.expires_at() + posix_time::millisec(500));
t.async_wait(bind(&a_timer::call_func,this,placeholders::error));
}
};

void Print1()
{
cout<<"Hello,Print1..."<<endl;
}

void Print2()
{
cout<<"Hello,Print2..."<<endl;
}

void TestBind()
{
io_service ios;
a_timer at1(ios,5,Print1);
a_timer at2(ios,5,Print2);
ios.run();
}

int main()
{
//SyncTimer();
//AsyncTimer();
TestBind();
cout<<"successful!..."<<endl;
}


编译方法如下:
g++ -g -o main boost_async_timer_bind.cpp -lboost_system

报错如下:
[root@CentOS1 Boost]# g++ -g -o main boost_async_timer_bind.cpp -lboost_system
boost_async_timer_bind.cpp: In constructor ‘a_timer::a_timer(boost::asio::io_service&, int, F)’:
boost_async_timer_bind.cpp:62: 错误:不能从 ‘void (a_timer::*)(const boost::system::error_code&)’ 转换到 ‘int’,为实参 ‘1’(属于 ‘int bind(int, const sockaddr*, socklen_t)’)
boost_async_timer_bind.cpp: In member function ‘void a_timer::call_func(const boost::system::error_code&)’:
boost_async_timer_bind.cpp:72: 错误:不能从 ‘void (a_timer::*)(const boost::system::error_code&)’ 转换到 ‘int’,为实参 ‘1’(属于 ‘int bind(int, const sockaddr*, socklen_t)’)

5 个解决方案

#1


auto x=&a_timer::call_func;
int call_func=*(int*)&x;

看看这样能行不.

#2


用boost就boost::bind,用std就std::bind,别跟艹蛋的::bind过不去。

#3


引用 2 楼 FrankHB1989 的回复:
用boost就boost::bind,用std就std::bind,别跟艹蛋的::bind过不去。

++
目测是命名冲突
boost::bind,std::bind和网络通讯的bind产生命名冲突了.

#4


看你写的代码 真蛋疼

#5


这个问题已经解决,是命名冲突

#1


auto x=&a_timer::call_func;
int call_func=*(int*)&x;

看看这样能行不.

#2


用boost就boost::bind,用std就std::bind,别跟艹蛋的::bind过不去。

#3


引用 2 楼 FrankHB1989 的回复:
用boost就boost::bind,用std就std::bind,别跟艹蛋的::bind过不去。

++
目测是命名冲突
boost::bind,std::bind和网络通讯的bind产生命名冲突了.

#4


看你写的代码 真蛋疼

#5


这个问题已经解决,是命名冲突