2013-11-23 2 views
1

В этой части кода из example:Почему `boost :: bind()` не может быть заменен на `std :: bind()` здесь?

int main() 
{ 
    boost::asio::io_service io; 
    printer p(io); 
    boost::thread t(boost::bind(&boost::asio::io_service::run, &io)); 
    io.run(); 
    t.join(); 

    return 0; 
} 

Если я заменю boost::bind(&boost::asio::io_service::run, &io) к std::bind(&boost::asio::io_service::run, &io) я получаю ошибку компиляции:

.../usr/lib/c++/v1/functional:1843:1: note: candidate template 
    ignored: couldn't infer template argument '_Fp' 
bind(_Fp&& __f, _BoundArgs&&... __bound_args) 
^ 
/usr/lib/c++/v1/functional:1852:1: note: candidate template 
    ignored: couldn't infer template argument '_Rp' 
bind(_Fp&& __f, _BoundArgs&&... __bound_args) 
^ 
1 error generated. 

Почему эта ошибка произойдет?

Почему std::bind(&printer::print1, &p) работает, но std::bind(&boost::asio::io_service::run, &io) не работает?

+0

Добавить все строки вашего сообщения об ошибке. –

+0

'boost :: thread' имеет конструктор переадресации, поэтому вам не нужно связывать вообще:' boost :: thread t (& boost :: asio :: io_service :: run, &io); ' –

ответ

3

Компилятор сообщает вам, что он не мог определить тип первого аргумента std::bind.

Если вы посмотрите на io_service::run, вы увидите, что он перегружен. У компилятора был выбор, и это возможная причина того, что компилятор не выяснил тип. Чтобы проверить это, вы можете использовать литье:

std::bind(static_cast<size_t (boost::asio::io_service::*)()>(&boost::asio::io_service::run), &io) 

Этот способ делает выбор явным в коде.

С современным компилятором вам вообще не нужно использовать привязку. Вы можете сделать что-то вроде этого:

[&]() { io.run(); } 

Это позволяет избежать всех проблем с std::bind шаблона. Вам нужно рассмотреть переменное время жизни и копии по сравнению с ссылками.

+0

спасибо, но он также может not cast to 'std :: function ', но он может работать, когда я делаю это на 'std :: size_t (boost :: asio :: io_service :: *)()', boost :: bind может иметь дело с перегрузкой функция, возможно, лямбда-функция больше помогает! – user2763477

+0

'std :: function ' не имеет конструктора, принимающего указатель на функцию-член (не говоря уже о том, что создание 'std :: function' здесь абсолютно ненужных служебных данных). –

+0

@ IgorR. Да, вы правы, я написал «текст» в тексте, но потом набрал что-то еще полностью! Исправит код. – janm

Смежные вопросы