Rewording from a previous post:
 
Are there any issues with binding a boost:ref to a free templated function? On gcc32 this generates an error:
 
class Test { };
 
template <class T> void foo(T arg_) { }
 
int main(int)

  Test t;
  boost::reference_wrapper<Test> tr(t); 
  boost::function<void()> fun1 = boost::bind(&::foo<boost::reference_wrapper<Test> >, tr);       // line 41
}

- Alex
 

From: Barchenkov, Alexei (IT)
Sent: Friday, March 23, 2007 12:55 PM
To: boost-users@lists.boost.org
Subject: question about binding a boost::reference_wrapper argument inside a templated function

I am getting an error when compiling the following code on gcc32. Could someone please point out what is the problem? Thank you. 
 
class Test { };
 
template <class T>
void foo(T arg_) { }
 
template <class T>
void fooRef(const T& arg_){ }
 
int main(int)

  Test t;
  boost::reference_wrapper<Test> tr(t); 
  boost::function<void()> fun1 = boost::bind(&::foo<boost::reference_wrapper<Test> >, tr);       // line 41
  boost::function<void()> fun2 = boost::bind(&::fooRef<boost::reference_wrapper<Test> >, tr);  // line 42
}
 
....
 
/ms/dist/fsf/PROJ/boost/1.33.1/common/include/boost/bind.hpp: In member
   function `void boost::_bi::list1<A1>::operator()(boost::_bi::type<void>, F&,
   A&, int) [with F = void (*)(boost::reference_wrapper<Test>), A =
   boost::_bi::list0, A1 = boost::reference_wrapper<Test>]':
/ms/dist/fsf/PROJ/boost/1.33.1/common/include/boost/bind/bind_template.hpp:20:   instantiated from `boost::_bi::result_traits<R, F>::type boost::_bi::bind_t<R, F, L>::operator()() [with R = void, F = void (*)(boost::reference_wrapper<Test>), L = boost::_bi::list1<boost::reference_wrapper<Test> >]'
/ms/dist/fsf/PROJ/boost/1.33.1/common/include/boost/function/function_template.hpp:136:   instantiated from `static void boost::detail::function::void_function_obj_invoker0<FunctionObj, R>::invoke(boost::detail::function::any_pointer) [with FunctionObj = boost::_bi::bind_t<void, void (*)(boost::reference_wrapper<Test>), boost::_bi::list1<boost::reference_wrapper<Test> > >, R = void]'
/ms/dist/fsf/PROJ/boost/1.33.1/common/include/boost/function/function_template.hpp:479:   instantiated from `void boost::function0<R, Allocator>::assign_to(FunctionObj, boost::detail::function::function_obj_tag) [with FunctionObj = boost::_bi::bind_t<void, void (*)(boost::reference_wrapper<Test>), boost::_bi::list1<boost::reference_wrapper<Test> > >, R = void, Allocator = std::allocator<void>]'
/ms/dist/fsf/PROJ/boost/1.33.1/common/include/boost/function/function_template.hpp:430:   instantiated from `void boost::function0<R, Allocator>::assign_to(Functor) [with Functor = boost::_bi::bind_t<void, void (*)(boost::reference_wrapper<Test>), boost::_bi::list1<boost::reference_wrapper<Test> > >, R = void, Allocator = std::allocator<void>]'
/ms/dist/fsf/PROJ/boost/1.33.1/common/include/boost/function/function_template.hpp:294:   instantiated from `boost::function0<R, Allocator>::function0(Functor, boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type) [with Functor = boost::_bi::bind_t<void, void (*)(boost::reference_wrapper<Test>), boost::_bi::list1<boost::reference_wrapper<Test> > >, R = void, Allocator = std::allocator<void>]'
/ms/dist/fsf/PROJ/boost/1.33.1/common/include/boost/function/function_template.hpp:638:   instantiated from `boost::function<R ()(), Allocator>::function(Functor, boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type) [with Functor = boost::_bi::bind_t<void, void (*)(boost::reference_wrapper<Test>), boost::_bi::list1<boost::reference_wrapper<Test> > >, R = void, Allocator = std::allocator<void>]'
test10.C:41:   instantiated from here
/ms/dist/fsf/PROJ/boost/1.33.1/common/include/boost/bind.hpp:229: conversion
   from `Test' to non-scalar type `boost::reference_wrapper<Test>' requested
/ms/dist/fsf/PROJ/boost/1.33.1/common/include/boost/bind.hpp: In member
   function `void boost::_bi::list1<A1>::operator()(boost::_bi::type<void>, F&,
   A&, int) [with F = void (*)(const boost::reference_wrapper<Test>&), A =
   boost::_bi::list0, A1 = boost::reference_wrapper<Test>]':
/ms/dist/fsf/PROJ/boost/1.33.1/common/include/boost/bind/bind_template.hpp:20:   instantiated from `boost::_bi::result_traits<R, F>::type boost::_bi::bind_t<R, F, L>::operator()() [with R = void, F = void (*)(const boost::reference_wrapper<Test>&), L = boost::_bi::list1<boost::reference_wrapper<Test> >]'
/ms/dist/fsf/PROJ/boost/1.33.1/common/include/boost/function/function_template.hpp:136:   instantiated from `static void boost::detail::function::void_function_obj_invoker0<FunctionObj, R>::invoke(boost::detail::function::any_pointer) [with FunctionObj = boost::_bi::bind_t<void, void (*)(const boost::reference_wrapper<Test>&), boost::_bi::list1<boost::reference_wrapper<Test> > >, R = void]'
/ms/dist/fsf/PROJ/boost/1.33.1/common/include/boost/function/function_template.hpp:479:   instantiated from `void boost::function0<R, Allocator>::assign_to(FunctionObj, boost::detail::function::function_obj_tag) [with FunctionObj = boost::_bi::bind_t<void, void (*)(const boost::reference_wrapper<Test>&), boost::_bi::list1<boost::reference_wrapper<Test> > >, R = void, Allocator = std::allocator<void>]'
/ms/dist/fsf/PROJ/boost/1.33.1/common/include/boost/function/function_template.hpp:430:   instantiated from `void boost::function0<R, Allocator>::assign_to(Functor) [with Functor = boost::_bi::bind_t<void, void (*)(const boost::reference_wrapper<Test>&), boost::_bi::list1<boost::reference_wrapper<Test> > >, R = void, Allocator = std::allocator<void>]'
/ms/dist/fsf/PROJ/boost/1.33.1/common/include/boost/function/function_template.hpp:294:   instantiated from `boost::function0<R, Allocator>::function0(Functor, boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type) [with Functor = boost::_bi::bind_t<void, void (*)(const boost::reference_wrapper<Test>&), boost::_bi::list1<boost::reference_wrapper<Test> > >, R = void, Allocator = std::allocator<void>]'
/ms/dist/fsf/PROJ/boost/1.33.1/common/include/boost/function/function_template.hpp:638:   instantiated from `boost::function<R ()(), Allocator>::function(Functor, boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type) [with Functor = boost::_bi::bind_t<void, void (*)(const boost::reference_wrapper<Test>&), boost::_bi::list1<boost::reference_wrapper<Test> > >, R = void, Allocator = std::allocator<void>]'
test10.C:42:   instantiated from here
/ms/dist/fsf/PROJ/boost/1.33.1/common/include/boost/bind.hpp:229: could not
   convert `(+a)->boost::_bi::list0::operator[](const
   boost::reference_wrapper<T>&) const [with T = Test](this)' to `const
   boost::reference_wrapper<Test>&'

NOTICE: If received in error, please destroy and notify sender. Sender does not intend to waive confidentiality or privilege. Use of this email is prohibited when received in error.