John Maddock wrote:
Kirit Sælensminde wrote:
I'm wondering if finding the need to add specialisations of boost::detail::function_traits_helper is a result of missing headers, incorrect usage or just things that have not been added to Boost.TypeTraits on purpose?
Not added on purpose: function_traits works for *function types*, and not *pointer to function types*.
So:
functions_traits
OK. function_traits bad: argument not a function type. You can always use remove_pointer to strip a function-pointer down to a function type.
HTH, John.
That makes perfect sense, unfortunately it doesn't help. From the worker thread example I've removed the specialisation for R(**)(void) - I can't work out why there is a double indirection there, but it might well be contributing to the problem. I've also changed the functor that does the type handling to this: template< typename F > boost::shared_ptr< Future< typename boost::function_traits< F
::result_type > > operator()( F f ) { return run< typename boost::function_traits< typename boost::remove_pointer< F >::type >::result_type >( f ); }
And even to this: template< typename F > boost::shared_ptr< Future< typename boost::function_traits< F
::result_type > > operator()( F f ) { return run< typename boost::function_traits< typename boost::remove_pointer< typename boost::remove_pointer< F >::type >::type ::result_type >( f ); }
I get exactly the same error in either case:
1>e:\dev\trunk\clients\kirit saelensminde\samples\boost cookbook\worker
thread\worker thread.cpp(112) : warning C4355: 'this' : used in base
member initializer list
1>e:\dev\boost\install\basic\include\boost-1_34\boost\type_traits\function_traits.hpp(170)
: error C2504: 'boost::detail::function_traits_helper<Function>' : base
class undefined
1> with
1> [
1> Function=int (__cdecl **)(void)
1> ]
1> e:\dev\trunk\clients\kirit saelensminde\samples\boost
cookbook\worker thread\worker thread.cpp(209) : see reference to class
template instantiation 'boost::function_traits<Function>' being compiled
1> with
1> [
1> Function=int (__cdecl *)(void)
1> ]
1>e:\dev\trunk\clients\kirit saelensminde\samples\boost cookbook\worker
thread\worker thread.cpp(209) : error C2893: Failed to specialize
function template
'boost::shared_ptr