bind и ошибки компиляции
От: Аноним  
Дата: 25.09.13 18:13
Оценка:
Объясните, пожалуйста, почему следующий код не компилируется?

#include <functional>
#include <iostream>
#include <thread>

void callback_function(int first, double second)
{
    std::cout << first << ' ' << second << '\n';
}

void foo(std::function<void()> callback)
{
    callback();
}

int main()
{
    std::thread th(std::bind(foo, std::bind(callback_function, 0, 1.0)));
    th.join();
}


error C2664: 'void (std::function<void (void)>)' : cannot convert parameter 1 from 'void' to 'std::function<void (void)>'


В то время как следующий код компилируется без каких-либо проблем:

#include <functional>
#include <iostream>
#include <thread>

void callback_function(int first, double second)
{
    std::cout << first << ' ' << second << '\n';
}

void foo(std::function<void()> callback)
{
    callback();
}

int main()
{
    std::function<void()> callback = std::bind(callback_function, 0, 1.0);
    std::thread th(std::bind(foo, callback));
    th.join();
}


То же самое с boost. Данный код не компилируется:

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/thread.hpp>

#include <iostream>

void callback_function(int first, double second)
{
    std::cout << first << ' ' << second << '\n';
}

void foo(boost::function<void()> callback)
{
    callback();
}

int main()
{
    boost::thread th(boost::bind(foo, boost::bind(callback_function, 0, 1.0)));
    th.join();
}


error C2664: 'void (boost::function<void (void)>)' : cannot convert parameter 1 from 'void' to 'boost::function<void (void)>'


В то время как следующий код компилируется без проблем:

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/thread.hpp>

#include <iostream>

void callback_function(int first, double second)
{
    std::cout << first << ' ' << second << '\n';
}

void foo(boost::function<void()> callback)
{
    callback();
}

int main()
{
    boost::function<void()> callback = boost::bind(callback_function, 0, 1.0);
    boost::thread th(boost::bind(foo, callback));
    th.join();
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.