powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Анонимный шаблон ?
5 сообщений из 5, страница 1 из 1
Анонимный шаблон ?
    #38890633
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясните, пож-та, смысл такой записи шаблона, в который не передается параметр

Код: plaintext
1.
2.
3.
4.
5.
template <class t>
struct Vec2
{
	template <class > friend std::ostream& operator<<(std::ostream& s, Vec2<T>& v);
};
...
Рейтинг: 0 / 0
Анонимный шаблон ?
    #38890659
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Герой дня,

1) Там передается параметр, но он безымянный.
Это возможно если шаблон не зависит от типа параметра. Тогда имя параметра можно опустить.
Например.
Код: plaintext
1.
2.
3.
template <class > struct F {};
F<int> f1;
F<char> f2;



Обычно такое используется при определении специализаций, которые используют не все параметры исходного шаблона.

2) Если рассматривать конкретно ваш пример, то он бессмысленный и нерабочий.

Оператор << должен выглядеть так:
Код: plaintext
1.
2.
3.
4.
5.
template <class T>
struct Vec2
{
	friend std::ostream& operator<<(std::ostream& s, const Vec2<T>& v);
};


Или так
Код: plaintext
1.
2.
3.
4.
5.
template <class T>
struct Vec2
{
	template <class Stream> friend Stream& operator<<(Stream& s, const Vec2<T>& v);
};


Иначе код который его использует не будет работать
Код: plaintext
1.
2.
Vec2<int> v;
cout << v;
...
Рейтинг: 0 / 0
Анонимный шаблон ?
    #38890675
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

спасибо, код взят с Хабра под GCC вот отсюда http://habrahabr.ru/post/248153/

раздел "Проволочный рендер"

https://github.com/ssloy/tinyrenderer/blob/f6fecb7ad493264ecd15e230411bfb1cca539a12/geometry.h
...
Рейтинг: 0 / 0
Анонимный шаблон ?
    #38890719
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Герой дня,

А, это я протупил.
Так как в операторе есть ссылка на шаблонный тип, то надо либо определение оператора оставить внутри класса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
template <class T>
struct Vec2
{
	friend std::ostream& operator<<(std::ostream& s, const Vec2<T>& v)
	{
	   ....
	}
};



Либо если же определение выносится из класса, то надо объявить отдельный параметр шаблона.

Полная форма такая.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
template <class t> struct Vec2 {
   template <class tt> friend std::ostream& operator<<(std::ostream& s, Vec2<tt>& v);
};

template <class t> std::ostream& operator<<(std::ostream& s, Vec2<t>& v) {
    ...
}


Но поскольку оператор объявлен внутри шаблона то объявление можно можно сократить до вашего примера, используя параметр из шаблона:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
template <class t> struct Vec2 {
   template <class > friend std::ostream& operator<<(std::ostream& s, Vec2<t>& v);
};

template <class t> std::ostream& operator<<(std::ostream& s, Vec2<t>& v) {
    ...
}
...
Рейтинг: 0 / 0
Анонимный шаблон ?
    #38891152
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Явное указание очевиднее для восприятия

Спб
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Анонимный шаблон ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]