
on Fri Jul 11 2008, "Robert Jones" <robertgbjones-AT-gmail.com> wrote:
On Fri, Jul 11, 2008 at 7:08 PM, Steven Watanabe <watanabesj@gmail.com> wrote:
Robert Jones wrote:
I'm sorry, I'm not quite following! I understand ADL in general, but not how it applies specifically here. What overloading is being found/not found by ADL in this context?
The overload of operator<< for std::pair is not found by Boost.Lambda.
This much I have discovered painfully by trial and error - the bit I don't understand is why!
Because was not in scope at the point where the lambda's operator() is defined, and it isn't defined in a namespace associated with any of the arguments you passed to it (ostream and std::pair<...>). Those are the lookup rules for unqualified calls in templates. namespace bll { template <class T> void f(T x) { // looks backwards from this point for op<< defined in // namespaces :: and ::bll::. Looks backwards from the // point of instantiation for op<< defined in any // namespaces associated with T. x << x; } }; I think I got that right.
Also, it would be very handy if you can suggest a method of achieving the effect I'm looking for.
Depends what effect that is; it may or may not be achievable. -- Dave Abrahams BoostPro Computing http://www.boostpro.com