使用boost :: bind删除的函数

时间:2014-04-17 00:01:36

标签: c++ boost boost-asio

我目前正在使用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;
}

1 个答案:

答案 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()中的变量)。