Boost logo

Boost Users :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2004-06-02 13:24:32


Agoston Bejo wrote:
> Hi,
> Please take a look at the code below.
> The point is that for_each_treenode calls for_each_treenode_child. It
> seems to me that
> bind(Print, ref(cout), _1)(&t);
> is not the same as
> Print(cout, &t);
> But if this is the case, how come that
> for_each_treenode_child(&t, bind(Print, ref(cout), _1));
> compiles and works without problem?

[...]

> Print(cout, &t); // WORKS
> bind(Print, ref(cout), _)(&t); // GENERATES ERROR (1)

The error is caused by the fact that &t is an rvalue.

Tree * pt = &t;
bind(Print, ref(cout), _1)(pt); // should work

> for_each_treenode_child(&t, bind(Print, ref(cout), _1)); // WORKS
> for_each_treenode(&t, bind(Print, ref(cout), _1)); // GENERATES ERROR (2)

This is a bit more convoluted. The problem is that for_each_treenode uses
bind(Print, ref(cout), _1) as an argument to bind. The inner bind is
interpreted as a nested bind expression and evaluated. Use either

for_each_treenode(&t, protect(bind(Print, ref(cout), _1))); // should work

or change the bind in for_each_treenode to bind(thisFunc, _1, protect(f)).

protect lives in <boost/bind/protect.hpp>.


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