Возможно, вы захотите пойти к более общему решению проблемы, позволяющему печатать практически любой итеративный тип:
#include <vector>
#include <iostream>
template <typename Iterable>
std::ostream& operator<<(std::ostream& os, const Iterable& vals)
{
for (const auto& val : vals)
os << val << std::endl;
return os;
}
int main()
{
auto simple_vec = std::vector<int>{3, 5 , 7};
std::cout << simple_vec;
auto nested_vec = std::vector<std::vector<int>>{{1, 2}, {3, 4}};
std::cout << nested_vec;
}
Для дальнейшего усовершенствования этого решения вы можете попробовать использовать SFINAE, чтобы убедиться, что шаблон <<
доступен только для повторяемых типов.