@AlexeiNe

Что значит шаблон friend-функции внутри структуры?

Пара вопросов по коду:

template <class t> struct Vec2 {
	union {
		struct {t u, v;};
		struct {t x, y;};
		t raw[2];
	};
	Vec2() : u(0), v(0) {}
	Vec2(t _u, t _v) : u(_u),v(_v) {}

	inline Vec2<t> operator +(const Vec2<t> &V) const { return Vec2<t>(u+V.u, v+V.v); }
	inline Vec2<t> operator -(const Vec2<t> &V) const { return Vec2<t>(u-V.u, v-V.v); }
	inline Vec2<t> operator *(float f)          const { return Vec2<t>(u*f, v*f); }
	template <class > friend std::ostream& operator<<(std::ostream& s, Vec2<t>& v);
};

template <class t> std::ostream& operator<<(std::ostream& s, Vec2<t>& v) {
	s << "(" << v.x << ", " << v.y << ")\n";
	return s;
}


Конкретно по последней функции внутри структуры:
template <class > friend std::ostream& operator<<(std::ostream& s, Vec2<t>& v);

1. Что значит шаблон без указания идентификатора типа данных template <class >?

2. Для чего внутри структуры объявлять friend-функцию? Насколько я знаю, по-умолчанию все поля и функции структуры объявлены как public.
  • Вопрос задан
  • 494 просмотра
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
По всем этим вопросам к прочтению предлагаю следующую книгу: Дэвид Вандевурд, Николаи М. Джосаттис: Шаблоны 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".
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы