I see -- OK, overloading << isn't necessary, as long as I can say something like "std::cout << "My vector is " << PrintContainer(vec) << ".\n" without having to touch the definition of PrintContainer in the future.