Boost logo

Boost Users :

Subject: Re: [Boost-users] [lambda] instantiation in bind
From: Stuart Dootson (stuart.dootson_at_[hidden])
Date: 2009-07-20 14:37:47


On Mon, Jul 20, 2009 at 7:24 PM, Igor R <boost.lists_at_[hidden]> wrote:
>
> In VC9.0 the following code gives the error message:
> 1>...\boost\tuple\detail\tuple_basic.hpp(419) : error C2259: 'Base' :
> cannot instantiate abstract class
>
> If the Base is not abstract, the code compiles and works as expected.
> Unfortunately, I'm unable to realise why it tries to instantiate the
> Base, and how to overcome this issue, so any enlightenment would be
> greatly appreciated!
>
> class Base
> {
> public:
>  virtual void close() = 0;
> };
>
> class Derived : public Base
> {
> public:
>  void close()
>  {}
> };
>
> #include <boost/shared_ptr.hpp>
>
> typedef boost::shared_ptr<Base> BasePtr;
> typedef boost::shared_ptr<BasePtr> BasePtrPtr;
>
> #include <boost/lambda/lambda.hpp>
> #include <boost/lambda/bind.hpp>
>
> namespace bl = boost::lambda;
>
> BasePtrPtr makeHolder(Base *base)
> {
>  return BasePtrPtr(new BasePtr(base), bl::bind(&Base::close, **bl::_1));
> }
>
>
> int main()
> {
>  Base *b = new Derived();
>  makeHolder(b);
>  return 0;
> }

The **bl::_1 (I suspect) results in a Base (eventually) rather than a
Base& (which I guess is what you wanted). Using the fact that bind
will take an object pointer (as opposed to an object/object
reference), you can use this:

   return BasePtrPtr(new BasePtr(base), bl::bind(&Base::close,
bl::bind(&BasePtr::get, bl::_1)));

For some reason, *bl::_1 didn't want to compile. I'm making no
guesses, so I just tried BasePtr::get, which I've used before (and
compiles!)

Stuart Dootson


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