Suppose I have the following:

class Base {
  void foo(int);
};

class Derived: private Base {
public:
  void bar();
};

void Derived::bar() {
  vector<int> v;
  for_each(v.begin(), v.end(),
           boost::bind(&Base::foo,this,_1));
}

This is a reasonably common thing to want to do, except for the private 
inheritance part... It bombs because in the instantiation of bind, it 
knows this is a Derived *, and doesn't try to forcibly instantiate the 
version which takes a Base * (even though it knows that Base::foo is a 
member of Base). Then in operator() it is using a pointer to Derived to 
attempt to call a function on Base. That's no good.

I think it might be possible to fix this, but it's tricky. Just 
defining the partial specialization for Base * in boost::bind won't 
work because it'll find the exact template match instead. I think 
instead you have to define a partial specialization for all pointers in 
which you use the version that takes the Base *. Unfortunately that 
leads to an asymmetry for references, where I don't think you can get 
away with doing the simple partial specialization without yet more 
metacode. Probably doable but painful.

Anyway, it's not that hard to work around in the client code of course 
(a simple static_cast<Base *>(this)), but I thought I would mention it 
as a test case if someone wants to improve the user-friendliness of 
boost::bind even further.

George Heintzelman
[EMAIL PROTECTED]


_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to