Как уже отмечалось, что-то вроде этого должно работать:
template <typename T>
ostream& operator << (ostream &out,const Vector<T>& vec) {
// body here
}
Что касается требования друга, с ним легче всего справиться так:
template <typename T>
ostream& operator << (ostream &out,const Vector<T>& vec) {
vec.print_on( out );
return out;
}
Однако , обычно я думаю, что любой оператор вывода, подобный этому, требует, чтобы доступ к внутренним компонентам класса показал вам ошибку в вашем Vector
классе. На самом деле для отображения требуется только использовать общедоступный интерфейс.
Другое дело, что вы можете также захотеть шаблонизировать сам поток вывода, чтобы вы могли сохранить его тип:
template <typename O, typename C, typename T>
std::basic_ostream<O, C>& operator << (std::basic_ostream<O, C> &out,const Vector<T>& vec) {
vec.print_on( out );
return out;
}
Vector
print_on
все еще может использовать ostream
.