![]() |
|
Модераторы: bsa |
![]()
|
|
| neocpp |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 21.1.2013 Репутация: нет Всего: нет |
Возникла проблема при изучении шаблонов, а именно не понимаю, как передатся указатель в шаблонную функцию.
В этом коде, как я понимаю, на основе шаблона генерируется функция типа:
Потому что T заменилось на int*. Тогда вопрос, почему если шаблон сделать таким:
то функция работает по прежнему? На мой взгляд после замены T на int* должна получиться несуразица типа:
|
||||||||
|
|||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
| neocpp |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 21.1.2013 Репутация: нет Всего: нет |
||||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Вы просто вызвали функцию. Аргументы шаблона (в функции) выводятся из спецификации параметров, а не берутся из первых попавшихся параметров, и не задаются явно Ваша спецификация функции была void foo(T* x, int size), а вызов void foo(int* x, int size), откуда следует, что T это int, т.к. указатель уже присутствовал в формальном параметре, и следовательно он в шаблонный тип T не попал. Если вы явно попробуете вызвать такую функцию с шаблонным параметром int*, то вы получите ошибку:
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| neocpp |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 21.1.2013 Репутация: нет Всего: нет |
Спасибо, попробую разобраться, в книге вроде бы дальше подробнее этот момент объяснен. Но пока я не совсем понял механизм, что и куда подставляется и как создается конкретный вариант функции.
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
если явно указаны типы шаблона, то тип берется из этого указания, иначе включается механизм детекции. При детекции выбирается подходящая функция и по ней детектируется тип..
так в случае:
при передачe int *, "формируется" void fn(int *); где Т детектируется как int. а в случае:
при передачe int *, также "формируется" void fn(int *); но Т детектируется как int*. Это сообщение отредактировал(а) mes - 21.1.2013, 23:05 |
||||
|
|||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
neocpp, в вашем (первом) случае вывод типа основывается лишь на одном: у типа должен быть operator[](int)
под этот тип подходят указатели на int и более сложные типы, имеющие упомянутую функцию, например std::vector http://codepad.org/b4nakONH во втором случае указатель присутствует явно, операция [] ему тоже соответствует, но уже как явному указателю. (и что-то типа vector уже не передашь) а чтобы тип вывелся как int** требуется двойное разыменование - **x или x[i][j] и т.п. |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
"вывод типа" в данном контексте совсем не подходит... Добавлено через 33 секунды
в теле функции ?! |
||||
|
|||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
хотел прояснить, но видимо только запутал))
конечно не из тела, а из фактического параметра. параметр у меня за кадром остался и в первой части - не вывод, конечно, а соответствие |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |