Why can't a function in a namespace see my operator<< defined globally?

Unqualified lookup goes up one level at a time and stops as soon as it finds something. It finds an operator<< within the anonymous namespace - the very one you are calling from - and stops dead right there.

Consider wrapping an element of the pair or the pair itself into a wrapper in your own namespace. Then you can define an operator<< to do whatever you want and have it picked up by ADL.

Is there a way to make this work without modifying the Container class?

Yes. You have to put the operator<< inside the namespace.

DEMO here.

Search for operator << is only happening within the namespace container.value is defined in. Related Post.