This is done so that the library's input/output operators do not interfere with those the user might want to define. In fact, it is highly unlikely that any pre-defined I/O operator will suit the needs of a client application. On the other hand, those applications for which the PPL I/O operator are enough can easily obtain access to them. For example, a directive like
using namespace Parma_Polyhedra_Library::IO_Operators;
const ConSys& cs = ...; copy(cs.begin(), cs.end(), ostream_iterator<Constraint>(cout, "\n"));
namespace Parma_Polyhedra_Library { // Import all the output operators into the main PPL namespace. using IO_Operators::operator<<; }