boost::bind used with boost shared_ptr

Hi, I've recently been making more use of boost::bind, and I coded the following, which I thought would work: class A { public: void reset () {} }; typedef std::map<int, boost::shared_ptr<A> > map_type; map_type m; std::for_each (m.begin(), m.end(), boost::bind(&A::reset, boost::bind(&map_type::value_type::second, _1))); but fails to compile. Next I tried this: std::for_each (m.begin(), m.end(), boost::bind(&A::reset, boost::bind(&boost::shared_ptr<A>::get, boost::bind(&map_type::value_type::second, _1)))); Which works and is fine (I guess). I just wonder why the first syntax is not supported? boost::shared_ptr is supposed to behave like a pointer (and here it seems that it does not). -- Kevin

Kevin Ludwig:
Hi,
I've recently been making more use of boost::bind, and I coded the following, which I thought would work:
class A { public: void reset () {} }; typedef std::map<int, boost::shared_ptr<A> > map_type; map_type m; std::for_each (m.begin(), m.end(), boost::bind(&A::reset, boost::bind(&map_type::value_type::second, _1)));
but fails to compile.
This compiles for me with MSVC 7.1. What compiler and Boost version do you use? What errors do you get?

Hi, This is with RHEL, gcc version 3.4.6. I *think* the boost version is 1.32.0. -bash-3.00$ gcc -v Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.6/specs Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk --host=i386-redhat-linux Thread model: posix gcc version 3.4.6 20060404 (Red Hat 3.4.6-8) -bash-3.00$ The complete mini program I use is: [code] #include <map> #include <boost/bind.hpp> #include <boost/shared_ptr.hpp> class A { public: void reset() {} }; typedef boost::shared_ptr<A> ptr_type; typedef std::map<int,ptr_type> map_type; map_type m; int main() { m[1] = ptr_type(new A()); m[2] = ptr_type(new A()); for_each (m.begin(), m.end(), boost::bind(&A::reset, boost::bind(&map_type::value_type::second, _1))); return 0; } [/code] The following is the compiler error received: [output] -bash-3.00$ g++ -o tc tc.cpp /usr/include/boost/bind.hpp: In member function `void boost::_bi::list1<A1>::operator()(boost::_bi::type<void>, F&, A&, int) [with F = boost::_mfi::mf0<void, A>, A = boost::_bi::list1<std::pair<const int, ptr_type>&>, A1 = boost::_bi::bind_t<ptr_type, boost::_mfi::dm<ptr_type, std::pair<const int, ptr_type> >, boost::_bi::list1<boost::arg<1> > >]': /usr/include/boost/bind/bind_template.hpp:32: instantiated from `typename boost::_bi::result_traits<R, F>::type boost::_bi::bind_t<R, F, L>::operator()(A1&) [with A1 = std::pair<const int, ptr_type>, R = void, F = boost::_mfi::mf0<void, A>, L = boost::_bi::list1<boost::_bi::bind_t<ptr_type, boost::_mfi::dm<ptr_type, std::pair<const int, ptr_type> >, boost::_bi::list1<boost::arg<1> > > >]' /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_algo.h:158: instantiated from `_Function std::for_each(_InputIterator, _InputIterator, _Function) [with _InputIterator = std::_Rb_tree_iterator<std::pair<const int, ptr_type> >, _Function = boost::_bi::bind_t<void, boost::_mfi::mf0<void, A>, boost::_bi::list1<boost::_bi::bind_t<ptr_type, boost::_mfi::dm<ptr_type, std::pair<const int, ptr_type> >, boost::_bi::list1<boost::arg<1> > > > >]' tc.cpp:24: instantiated from here /usr/include/boost/bind.hpp:228: error: no match for call to `(boost::_mfi::mf0<void, A>) (ptr_type)' /usr/include/boost/bind/mem_fn_template.hpp:44: note: candidates are: R boost::_mfi::mf0<R, T>::operator()(T*) const [with R = void, T = A] /usr/include/boost/bind/mem_fn_template.hpp:49: note: R boost::_mfi::mf0<R, T>::operator()(U&) const [with U = ptr_type, R = void, T = A] /usr/include/boost/bind/mem_fn_template.hpp:54: note: R boost::_mfi::mf0<R, T>::operator()(T&) const [with R = void, T = A] -bash-3.00$ [/output] Anyway, since it works on VC7.1 I imagine that it was fixed in some later version of the library. Thanks, --Kevin On Wed, Mar 4, 2009 at 11:49 AM, Peter Dimov <pdimov@pdimov.com> wrote:
Kevin Ludwig:
Hi,
I've recently been making more use of boost::bind, and I coded the following, which I thought would work:
class A { public: void reset () {} }; typedef std::map<int, boost::shared_ptr<A> > map_type; map_type m; std::for_each (m.begin(), m.end(), boost::bind(&A::reset, boost::bind(&map_type::value_type::second, _1)));
but fails to compile.
This compiles for me with MSVC 7.1. What compiler and Boost version do you use? What errors do you get? _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
-- Kevin

Kevin Ludwig:
Hi,
This is with RHEL, gcc version 3.4.6. I *think* the boost version is 1.32.0.
1.32 is ancient history. :-) It works for me with g++ 3.4.4 and Boost 1.38.
Anyway, since it works on VC7.1 I imagine that it was fixed in some later version of the library.
Looks like it was fixed in https://svn.boost.org/trac/boost/changeset/31128 which was first released in... Boost 1.33.1, I guess.
participants (2)
-
Kevin Ludwig
-
Peter Dimov