Потому что *it
не реализует вставку потока. То есть, для operator<<
нет перегрузки, которая принимает ostream
и T
. Обратите внимание, что вы должны возвращать ostream& os
, чтобы разрешить цепочку операторов. Также ваше определение шаблона функции выглядит неправильно. Попробуйте сделать это вместо этого:
template< typename T >
ostream& operator<<(ostream& os, list<T> const& lst)
{
std::copy(
lst.begin(), lst.end()
, std::ostream_iterator< T >( os )
);
return os;
}
или, что еще лучше, для поддержки потоков по всем видам элементов и признаков:
template< typename Elem, typename Traits, typename T >
std::basic_ostream< Elem, Traits >& operator<<(
std::basic_ostream< Elem, Traits >& os
, std::list<T> const& lst
)
{
std::copy(
lst.begin(), lst.end()
, std::ostream_iterator< T >( os )
);
return os;
}
Кстати, вы можете передать разделитель конструктору std::ostream_iterator
для вставки между каждым элементом.
* Обновление: *
Я просто заметил, что даже если ваше объявление шаблона функции было правильным, вы будете иметь дело с зависимым типом. Итератор зависит от типа T
, поэтому вам нужно сообщить об этом компилятору:
typename list<T>::iterator it;