I'm trying to enable boost (1.54) thread version >=3 with my code and i run into a package_task compilation issue
I reduced my issue to a minimal test program that compiles fine on windows 7, but fails to compile on osx and linux (compilers info bellow) with BOOST_THREAD_VERSION = 3 or 4 (fine with boost thread version 2)
test succeded on
- Windows 7 with Visual 2010 Express sp1 with SDK 7.1 ok
test failed on
- Mac os x 10.6 Xcode 4.2 : gcc 4.2.1 and clang 3.0
- Mac os x 10.7 Xcode 4.4 : gcc and clang 4.0
- Ubuntu 13.04 gcc 4.7.4
The minimal test program :
#define BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK
#define BOOST_THREAD_VERSION 4
#include <boost/any.hpp>
#include <boost/thread.hpp>
#include <boost/function.hpp>
boost::any process()
{
return 1;
}
int main()
{
boost::function< boost::any () > f = &process ;
//boost::packaged_task< boost::any () > task(&process); // Works fine
boost::packaged_task< boost::any () > task(f);
return 0;
}
// Replacing 'boost::any' with 'int' make it compile.
Error log with clang on os x 10.6 :
In file included from /tmp/packaged_task_test/main.cpp:5:
In file included from boost/thread.hpp:24:
boost/thread/future.hpp:2298:27: error: no matching
member function for call to 'set_value_at_thread_exit'
this->set_value_at_thread_exit(f());
~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
boost/thread/future.hpp:2857:33: note: in instantiation
of member function 'boost::detail::task_object<boost::function<boost::any ()>, boost::any ()>::do_apply' requested here
task = task_ptr(new task_object_type(f));
^
/tmp/packaged_task_test/main.cpp:17:43: note: in instantiation of function template specialization
'boost::packaged_task<boost::any ()>::packaged_task<boost::function<boost::any ()> >' requested here
boost::packaged_task< boost::any () > task(f);
^
boost/thread/future.hpp:673:18: note: candidate function
not viable: no known conversion from 'result_type' (aka 'boost::any') to 'source_reference_type' (aka 'boost::any &') for 1st argument
void set_value_at_thread_exit(source_reference_type result_)
^
boost/thread/future.hpp:687:18: note: candidate function
not viable: no known conversion from 'result_type' (aka 'boost::any') to 'rvalue_source_type' (aka 'rv<boost::any> &') for 1st argument
void set_value_at_thread_exit(rvalue_source_type result_)
^
boost/thread/future.hpp:2329:25: error: no matching
member function for call to 'mark_finished_with_result'
this->mark_finished_with_result(f());
~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
boost/thread/future.hpp:2857:33: note: in instantiation
of member function 'boost::detail::task_object<boost::function<boost::any ()>, boost::any ()>::do_run' requested here
task = task_ptr(new task_object_type(f));
^
/tmp/packaged_task_test/main.cpp:17:43: note: in instantiation of function template specialization
'boost::packaged_task<boost::any ()>::packaged_task<boost::function<boost::any ()> >' requested here
boost::packaged_task< boost::any () > task(f);
^
boost/thread/future.hpp:627:18: note: candidate function
not viable: no known conversion from 'result_type' (aka 'boost::any') to 'source_reference_type' (aka 'boost::any &') for 1st argument
void mark_finished_with_result(source_reference_type result_)
^
boost/thread/future.hpp:633:18: note: candidate function
not viable: no known conversion from 'result_type' (aka 'boost::any') to 'rvalue_source_type' (aka 'rv<boost::any> &') for 1st argument
void mark_finished_with_result(rvalue_source_type result_)
^
2 errors generated.
Am i missing something ?
Regards,
Nicolas