Boost logo

Boost Users :

From: Bill Dozier (yg-boost-users_at_[hidden])
Date: 2002-06-27 09:37:14


Hi,

I'd like to be able to bind an object to to a member function argument,
like the example below. NB: if I make not_ok()'s first argument an int
and pass an int variable to bind, gcc will buy it. I've tried this every
way that makes any sense to me and I have not been able to get it to work.

I'm using gcc 2.95.3.

Thanks,
Bill

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

class D
{
private:
   int _d;
public:
   D()
     :_d(0)
   {}

   int d() const { return _d; }
   void d(int i) { _d = i; }
};

typedef boost::function<int, int> Foo;

class A
{
private:
   Foo _f;

public:
   A(Foo f)
     :_f(f)
   {}

   int doit(int i) { return _f(i); }
};

class B
{
public:
   int not_ok(const D *d, int j) { return d->d() + j; }
};

class C
{
public:
   int ok(int i) { return i * i; }
};

int fooBar(int j);

static Foo g = fooBar;

int fooBar(int j)
{
   B *b = new B;
   C *c = new C;

   Foo f1 = boost::bind(&C::ok, c, _1);
   A a1(f1);

   int i = 5;
   D *d = new D;
   d->d(3);
   Foo f2 = boost::bind(&B::not_ok, b, _1, d); //<-----
   A a2(f2);

   return a1.doit(i) + a2.doit(2);
}

/usr/local/devl/src/incl/boost/bind.hpp: In method `int
boost::_bi::list3<boost::_bi::value<B
*>,boost::arg<1>,boost::_bi::value<D *> >::operator ()<int,
boost::_mfi::mf2<int,B,const D *,int>, boost::_bi::list1<int &>
>(boost::_bi::type<int>, boost::_mfi::mf2<int,B,const D *,int>,
boost::_bi::list1<int &> &) const':
/usr/local/devl/src/incl/boost/bind/bind_template.hpp:33: instantiated
from `boost::_bi::bind_t<int,boost::_mfi::mf2<int,B,const D
*,int>,boost::_bi::list3<boost::_bi::value<B
*>,boost::arg<1>,boost::_bi::value<D *> > >::operator ()<int>(int &)'
/usr/local/devl/src/incl/boost/function/function_template.hpp:110:
instantiated from
`boost::detail::function::function_obj_invoker1<boost::_bi::bind_t<int,boost::_mfi::mf2<int,B,const
D *,int>,boost::_bi::list3<boost::_bi::value<B
*>,boost::arg<1>,boost::_bi::value<D *> >
>,int,int>::invoke(boost::detail::function::any_pointer, int)'
/usr/local/devl/src/incl/boost/function/function_template.hpp:437:
instantiated from
`boost::function1<int,int,boost::empty_function_policy,boost::empty_function_mixin,allocator<boost::function_base>
>::assign_to<boost::_bi::bind_t<int,boost::_mfi::mf2<int,B,const D
*,int>,boost::_bi::list3<boost::_bi::value<B
*>,boost::arg<1>,boost::_bi::value<D *> > >
>(boost::_bi::bind_t<int,boost::_mfi::mf2<int,B,const D
*,int>,boost::_bi::list3<boost::_bi::value<B
*>,boost::arg<1>,boost::_bi::value<D *> > >,
boost::detail::function::function_obj_tag)'
/usr/local/devl/src/incl/boost/function/function_template.hpp:388:
instantiated from
`boost::function1<int,int,boost::empty_function_policy,boost::empty_function_mixin,allocator<boost::function_base>
>::assign_to<boost::_bi::bind_t<int,boost::_mfi::mf2<int,B,const D
*,int>,boost::_bi::list3<boost::_bi::value<B
*>,boost::arg<1>,boost::_bi::value<D *> > >
>(boost::_bi::bind_t<int,boost::_mfi::mf2<int,B,const D
*,int>,boost::_bi::list3<boost::_bi::value<B
*>,boost::arg<1>,boost::_bi::value<D *> > >)'
/usr/local/devl/src/incl/boost/function/function_template.hpp:274:
instantiated from
`boost::function1<int,int,boost::empty_function_policy,boost::empty_function_mixin,allocator<boost::function_base>
>::function1<boost::_bi::bind_t<int,boost::_mfi::mf2<int,B,const D
*,int>,boost::_bi::list3<boost::_bi::value<B
*>,boost::arg<1>,boost::_bi::value<D *> > >
>(boost::_bi::bind_t<int,boost::_mfi::mf2<int,B,const D
*,int>,boost::_bi::list3<boost::_bi::value<B
*>,boost::arg<1>,boost::_bi::value<D *> > >)'
/usr/local/devl/src/incl/boost/function.hpp:459: instantiated from
`boost::function<int,int,boost::detail::function::unusable,boost::detail::function::unusable,boost::detail::function::unusable,boost::detail::function::unusable,boost::detail::function::unusable,boost::detail::function::unusable,boost::detail::function::unusable,boost::detail::function::unusable,boost::detail::function::unusable>::function<boost::_bi::bind_t<int,boost::_mfi::mf2<int,B,const
D *,int>,boost::_bi::list3<boost::_bi::value<B
*>,boost::arg<1>,boost::_bi::value<D *> > >
>(boost::_bi::bind_t<int,boost::_mfi::mf2<int,B,const D
*,int>,boost::_bi::list3<boost::_bi::value<B
*>,boost::arg<1>,boost::_bi::value<D *> > >)'
testBoost.C:61: instantiated from here
/usr/local/devl/src/incl/boost/bind.hpp:263: no match for call to
`(boost::_mfi::mf2<int,B,const D *,int>) (B *const &, int &, D *const &)'
/usr/local/devl/src/incl/boost/bind/mem_fn_template.hpp:212: candidates
are: int boost::_mfi::mf2<int,B,const D *,int>::operator ()(B *, const D
*, int) const
/usr/local/devl/src/incl/boost/bind/mem_fn_template.hpp:217:
      int boost::_mfi::mf2<int,B,const D *,int>::operator ()<B *const>(B
*const &, const D *, int) const
/usr/local/devl/src/incl/boost/bind/mem_fn_template.hpp:222:
      int boost::_mfi::mf2<int,B,const D *,int>::operator ()(B &, const
D *, int) const
/usr/local/devl/src/incl/boost/bind.hpp:263: warning: control reaches
end of non-void function `boost::_bi::list3<boost::_bi::value<B
*>,boost::arg<1>,boost::_bi::value<D *> >::operator ()<int,
boost::_mfi::mf2<int,B,const D *,int>, boost::_bi::list1<int &>
>(boost::_bi::type<int>, boost::_mfi::mf2<int,B,const D *,int>,
boost::_bi::list1<int &> &) const'


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net