![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| null56 |
|
||||||||||||||||||||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
Собственно шаблонами пользуюсь не очень часто.
Данную тему создал только для того, чтобы разобраться в одном интересном (для меня!!!) случае. Насколько мне известно, cpp файл шаблона генериться в момент компиляции на основании переданных параметров шаблонирования, что обязывает объявлять и определять функцию в *.h файле, в противном случае начинает ругаться линковщик... Хочу привезти несколько примеров, чтобы проще было объяснять... 1а) Функция - шаблон *.h
*.cpp
main.cpp
Результат при компиляции очевиден
Вроде всё правильно 1б) Та же функция шаблон *.h
Вывод: верен
Двигаемся далее к классам - шаблонам 2а) Класс шаблон *.h
*.cpp
Функция main
Вывод:
Тут возникает первый вопрос: почему компилятор требует, чтобы в файле *.h был ТОЛЬКО конструктор, а вот функцию get, можно оставить и в cpp файле? 2а) Тот же класс, с перенесенным конструктором в *.h файл работает нормально 3а) Обычный класс с функцией шаблоном *.h
*.cpp
main.cpp
вывод: вроде бы логичный
3б) Тот же класс, но вызовем функцию из конструктора в cpp файле .cpp
Вот тут я понял, что чего - то недогоняю, либо чего - то делаю не правильно Не могли бы вы подсказать, по третьему примеру, почему вызов этой функции в конструкторе позволяет обойти данный запрет на объявление функций шаблонов в cpp файле? Заранее благодарен за помощь |
||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
никакого файла не генерируется. Генерируется код.
Потому что конструктор использован, а функция get - нет. В этом случае конструктор и функция описаны в одном и том же translation юнит -е, при компиляции он генерирует функцию для того типа, для которого использован, а в случае использования шаблонной функции/класса в другом translation юните получишь ошибку, ибо в откомпилированном obj файле генерировать код уже сложновато. |
|||
|
||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
да, это я прозевал.. тупанул а вот за третий вопрос действительно спасибо, понятней стало... Добавлено через 3 минуты и 28 секунд самое главное, что это не глюк какой, а нормальное явление и можно его использовать.... |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Возможно это тоже будет тебе интересно. И здесь посмотри. Это сообщение отредактировал(а) Леопольд - 28.7.2009, 18:11 -------------------- вопросов больше чем ответов |
|||
|
||||
| ISergeyN |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 11.10.2008 Где: Україна Репутация: нет Всего: 2 |
Как вариант книгу почитать - "C++ Templates The Complete Guide" (Шаблоны C++ Справочник разработчика).
Думаю с гуглом проблем не будет. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |