
on Mon Jul 14 2008, "Robert Jones" <robertgbjones-AT-gmail.com> wrote:
On Fri, Jul 11, 2008 at 4:41 PM, David Abrahams <dave@boostpro.com> wrote:
Note that std::endl can cause you big troouble, but since you're using '\n' above I don't see a reason to worry. You do need something like "using namespace boost::lambda;" to make "_1" valid, though.
Back in the office on Monday morning, and applying my new found knowledge my Boost-using code compiles perfectly, but for one little snag!
For brevity and clarity I posted example code using '\n' line terminators. However my real code uses endl - which is indeed causing me big troouble!
Are there any techniques for successfully using std::endl in lamda functions?
Not any good ones. The problem is that endl is a function template and ostream << std::endl; matches the operator<< overload for stream manipulators, which are function pointers, something like: ostream& operator<<( ostream, some-concrete-function-pointer-type ); so the compiler implicitly specializes std::endl<X...> so that it gets the right function pointer. It's nasty. I do this if I really, really, really want to write endl instead of '\n' (not that I ever want that ;-> ): struct endl_ { friend ostream& operator<<(ostream& x, endl_) { x << std::endl; return x; }; } endl; Then I'd just stream my own endl. -- Dave Abrahams BoostPro Computing http://www.boostpro.com