По всем этим вопросам к прочтению предлагаю следующую книгу:
Дэвид Вандевурд, Николаи М. Джосаттис: Шаблоны C++....
Сходу можно сказать что объявление дружественности оператора лишнее - в заблуждение вводит, преимуществ не дает. Внешняя перегрузка конкретно этого оператора в дружественности не нуждается.
Проверка тут:
cpp.sh/73htm
По поводу конструкций вида "template< typename >" у Вандервуда написано так: "Поскольку шаблонный параметр параметра шаблона далее не используется, его имя можно опустить".
Это равнозначно объявлению функции вида "void foo( int32_t );". Неиспользуемые идентификаторы можно не писать, но это снижает культуру кода.
template <class > friend std::ostream& operator<<(std::ostream& s, Vec2<t>& v);
Параметр опущен потому что не используется. Вместо него используется шаблонный параметр "t" из "Vec2".
Это нужно для того, чтобы для любого конкретного "t" у "Vec2" был всего один дружественный оператор - инстанцированный от все того же "t".