|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.09.2011, 08:56 | #1 |
Пользователь
Регистрация: 05.10.2010
Сообщений: 46
|
Шаблоны, константы
Доброго времени суток. Читаю вот книжку Липпмана, наткнулся на кое-что для меня непонятное. Вот допустим такой код:
Код:
Вопрос2: что за тип такой вообще (&)[]? Ссылка на массив? А зачем? Почему не просто массив? Вопрос3: допустим, написал я функцию foo, ничего не делает, просто передаёт массив в ту же шаблонную ф-цию. Но тут ошибка несоответствия типов. Липман объясняет так: "вызов ошибочен, так как pval имеет тип int*, а не является l-значением типа "массив int"". А почему, когда я пишу просто Код:
Туплю-туплю вот, подскажите что-нибудь) Спасибо. |
03.09.2011, 16:29 | #2 | |||
Форумчанин
Регистрация: 29.09.2010
Сообщений: 636
|
не хотел отвечать т.к слабо разбираюсь в шаблонах, но все молчат - поэтому опишусь:
Цитата:
то есть вы имеете полное право написать Код:
Код:
то есть в данном случае ему удалось создать подходящий вариант, то есть подставить int (&r_array)[5]. а данные о размере массива известны еще при объявлении , ведь int a[] это неясное int a[5] в данном случае. Цитата:
имхо потому что передача например T r_array[size] автоматически преобразуется к виду T* r_array, где размер неизвестен. Цитата:
надеюсь не сказал ересь. |
|||
03.09.2011, 17:41 | #3 |
Пользователь
Регистрация: 05.10.2010
Сообщений: 46
|
Да, спасибо, как передать константу в угловых скобках более менее понял. Только про массив как-то ещё не совсем... Это что-то типа: Type будет заменено на int, а size на 5? Т.е. из
Код:
Код:
Ага, бытует, даже по запросу в гугле много чего подобного нашлось. Да вроде и в книжках так пишут, типа имя массива - константный указатель. А чем тогда является имя массива? По идее вещей оно же тоже адрес хранит? Плюс ещё и данные о размере массива что ли? хм... |
04.09.2011, 02:51 | #4 | |||
Форумчанин
Регистрация: 29.09.2010
Сообщений: 636
|
Цитата:
узнать таким образом размер массива не указывая его ясно. Цитата:
Цитата:
вот уж данные о массиве имя массива точно не хранит, а компилятор запросто хотя чёрт побери ... ведь если сделать sizeof(имя массива) - высветится то его реальный размер в байтах. блин короче я сам не знаю ) призываю экспертов в тему ! Последний раз редактировалось onewho; 04.09.2011 в 02:54. |
|||
04.09.2011, 08:41 | #5 | |
Пользователь
Регистрация: 05.10.2010
Сообщений: 46
|
Цитата:
Но тогда ещё один момент, как работает оператор delete[], откуда он-то размер берёт? Значит размер как-то и для указателя хранится? В чём тогда проблема при передаче указателя в функцию, почему нельзя как-то вытащить размер? |
|
04.09.2011, 23:28 | #6 |
Форумчанин
Регистрация: 29.09.2010
Сообщений: 636
|
на счёт откуда delete берёт размер - в стандарте по-моему не оговорено, соответсвенно остается на поруках разработчика компилятора. подробнее сказать не могу т.к тема сложная и не совсем нужная. гуглите)
размер вытащить можно ) с помощью хитроумных операций я видел примеры на другом форуме.. щас попытался найти но что-то тему не нашёл ту ... всё равно такие примеры абсолютно не переносимы, так что не стоит ими увлекаться, чисто для интересна почитать можно, но использовать в реальной работе - нет. |
05.09.2011, 08:16 | #7 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Шаблоны собираются на этапе компиляции, при этом будут созданы отдельные функции для всех вариантов параметров шаблонов. Отдельно для <int, 5>, отдельно для <int, 10> и <float, 18>. В случае с int*, размер массива будет доступен во время исполнения программы, т.е. компилятор не сможет заранее создать нужный экземпляр функции. Принцип С++ - максимальный объем работы выполнять во время компиляции, именно поэтому в плюсах шаблоны, а не Generics, как в C#.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Циклы и константы | romanzi | Общие вопросы Delphi | 4 | 24.08.2011 11:36 |
Константы | romantik2011 | PHP | 1 | 07.08.2011 06:12 |
С++ константы | Filipa | Помощь студентам | 2 | 06.01.2011 00:27 |
Константы | veter48 | Общие вопросы C/C++ | 10 | 14.09.2010 21:03 |
Константы с U, L и F | Smarti | Общие вопросы C/C++ | 5 | 01.09.2010 23:38 |