Есть несколько вариантов.
Сначала вы можете просто предоставить отдельную перегрузку operator<<
для std::vector
, т.е. g.:
template <typename T>
std::ostream& operator<< (std::ostream& s, std::vector<T> const& v)
{ /* your generic implementation */ return s; }
Затем он будет вызываться для каждого вектора на вашей карте:
os << it.first << " : " << it.second << "\n";
// ^ here...
Я считаю, что это самое чистое решение & ndash; но если он слишком универсальный, и вам нужно что-то действительно другое только для этого конкретного типа карты, то вы можете предоставить отдельную перегрузку исключительно для этого типа карты:
std::ostream& operator<<
(std::ostream& s, std::map<std::string, std::vector<int>> const& m)
{ /* your specific implementation */ return s; }
или, альтернативно, выделите для этого своего оператора:
template <>
std::ostream& operator<< <std::string, std::vector<int>>
(std::ostream& s, std::map<std::string, std::vector<int>> const& m)
{ /* your specific implementation */ return s; }