|
|
|
| Четыре раза читал про шаблоны в книге Бьерна Страуструпа про шаблоны
Никак не могу понять этих строк... template<class C> и все что с ними связано
зачем, почему, для чего... не понимаю...
объясните кто может :( | |
|
|
|
|
|
|
|
для: bronenos
(08.04.2007 в 11:42)
| | >> зачем, почему, для чего...
Зачем и для чего - это на самом деле один вопрос. И Страуструп на него вполне нормально отвечает в самом начале главы о шаблонах - чтобы иметь возможность написать алгоритм один раз, не переписывая его каждый раз для нового типа данных. Например, написал я алгоритм сортировки для целых чисел. Если потом мне надо будет сортировать вещественные числа, мне придется создать копию этой функции, заменив тип int на double. При использовании механизма шаблонов я могу тело функции написать только один раз, а компилятор мне сгенерирует нужный код для разных типов данных.
Вопрос почему? не корректен. Почему кошку назвали кошкой? :-)
Хотя, наверное, на него можно ответить так: шаблоны пришлость придумать потому, что С++ строго типизированный язык - в функцию, принимающую в качестве параметра тип int не подставишь double. С помощю шаблонов такое ограничение можно преодолеть. | |
|
|
|
|
|
|
|
для: bronenos
(08.04.2007 в 11:42)
| | Все, теперь до меня дошло действие механизма этого...
Но все же маленькая непонятность
Встретил я такую строчку
template<class T> void func<T> (const T& arg) |
Примерно так она выглядела
Зачем нужно слово класс? Кроме класса там что нибудь может еще быть?
И почему обозначение типа стоит впритык к названию функции еще здесь? | |
|
|
|
|
|
|
|
для: bronenos
(09.04.2007 в 12:03)
| | >Зачем нужно слово класс?
Так принято, на самом деле теперь вместо ключевого слова class можно использовать ключевое слово typename (чтобы не рождать неуместных ассоциаций).
template<typename T> void func<T> (const T& arg) |
>Кроме класса там что нибудь может еще быть?
Это лишь ключевое слово - оно обозначает, что вы объявляете параметр, в качестве которого может выступать хоть базовый тип, хоть класс.
>И почему обозначение типа стоит впритык к названию функции еще здесь?
Здесь допускается и пробел - пишите как удобнее | |
|
|
|
|
|
|
|
для: cheops
(09.04.2007 в 15:25)
| | не, пробелы это дело понятное
но почему
func<T> ? что здесь эта буква делает?
если бы аргумент то понятно... такой тип возвращаемого значения
но в данном случае... какой еще тип? | |
|
|
|
|
|
|
|
для: bronenos
(09.04.2007 в 15:37)
| | Хм... вообще говоря так не должно быть, правильное объявление функции выглядит следующим образом
template <class T> void func (const T& arg) |
| |
|
|
|
|
|
|
|
для: cheops
(11.04.2007 в 13:21)
| | В Dev-c (скачанном с ST) на попытку создания шаблона
template <c1ass e1emType>
void print( elemType *pbegin, elemType *pend )
{
while ( pbegin != pend ) {
cout << *pbegin << ' ';
++pbegin;
}
|
компилятор ругается
expected primary-expression before "template"
expected `;' before "template"
|
Никак не пойму, в чем дело? | |
|
|
|
|
|
|
|
для: ddhvvn
(12.07.2008 в 21:48)
| | А может там имелось в виду..
*(++pbegin) | |
|
|
|
|
|
|
|
для: bronenos
(13.07.2008 в 07:55)
| | Так ругается он на строчку выше, где template... | |
|
|
|
|
|
|
|
для: ddhvvn
(13.07.2008 в 11:57)
| | Ой, парни :D
Я просто проходился по форуму.. оказывается что тема собственно и есть моя, а я давно уже знаю эти темплейты теперь :D
А насчет этого.. может, между template и <class T> пробел не ставить? | |
|
|
|
|
|
|
|
для: bronenos
(13.07.2008 в 20:59)
| | Все варианты пробелов перепробованы! | |
|
|
|