我目前正在使用boost asio教程,而且我遇到了bind的问题: 当然默认代码有效:http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/tutorial/tuttimer3/src.html
但是当我尝试在print函数中使用引用而不是指针时,我遇到编译器错误:
error: use of deleted function ‘asio::basic_deadline_timer<boost::posix_time::ptime>::basic_deadline_timer(const asio::basic_deadline_timer<boost::posix_time::ptime>&)’ t.async_wait(boost::bind(do_sth1,asio::placeholders::error,t, count));
我修改过的代码:
#include <iostream>
#include <asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
void do_sth1(const asio::error_code& ,asio::deadline_timer& t, int& count )
{
if(count<=5){
(count)++;
t.expires_at(t.expires_at()+boost::posix_time::seconds(2));
t.async_wait(boost::bind(do_sth1,asio::placeholders::error,t, count));
}
std::cout<<count<<"\n";
}
void do_sth2(const asio::error_code& ){
std::cout<<"Yo\n";
}
int main()
{
int count =0;
asio::io_service io;
asio::deadline_timer t1(io, boost::posix_time::seconds(1));
asio::deadline_timer t2(io, boost::posix_time::seconds(3));
t1.async_wait(boost::bind(do_sth1,asio::placeholders::error,t1,count));
t2.async_wait(do_sth2);
io.run();
std::cout << "Hello, world!\n";
return 0;
}
答案 0 :(得分:2)
最近才向C ++引入了删除的函数 - 参见例如here on MSDN。以前通过将该方法声明为私有来解决此问题。无论它采用何种方式,都意味着有人宣称其他隐式创建的方法已被删除,因此没有人能够(甚至意外地)调用它。例如,这用于禁止复制没有意义复制的对象(通过删除复制构造函数)。
这正是你的情况,因为删除的函数的名称‘asio::basic_deadline_timer::basic_deadline_timer(const asio::basic_deadline_timer&)
确实显示应该调用复制构造函数。无法复制boost::deadline_timer
。
但为什么要复制计时器对象?因为boost::bind
默认按值存储绑定参数。如果您需要传递引用,则需要使用boost::ref
,如下所示:
t1.async_wait(boost::bind(do_sth1,asio::placeholders::error,boost::ref(t1),boost::ref(count)));
即。即使对于count变量,它也不会导致编译器错误,但是不会起作用(不会修改main()
中的变量)。