|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||||||||||||||||
Как правильно разделить файл в шаблонами?22.09.2011, 05:22. Показов 9534. Ответов 5
Метки нет (Все метки)
Попробовал разделить один файл на два. В заголовочный "proba.h" поместил прототип шаблона и специализацию. В одном файле исходного кода оставил функцию main(), а во второй поместил определения шаблона и специализации.
Заголовочный файл "proba.h":
1>------ Построение начато: проект: 8-1, Конфигурация: Debug Win32 ------ 1> 8-1.cpp 1> Создание кода... 1> Компиляция... 1> 8-2.cpp 1> Создание кода... 1>8-1.obj : error LNK2019: ссылка на неразрешенный внешний символ "double __cdecl max5<double>(double * const,int)" (??$max5@N@@YANQANH@Z) в функции _main 1>8-1.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __cdecl max5<int>(int * const,int)" (??$max5@H@@YAHQAHH@Z) в функции _main 1>D:\MY C++Projects\8-4-5\Debug\8-1.exe : fatal error LNK1120: 2 неразрешенных внешних элементов ========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ========== Если же определене шаблона и специализации тоже записать в заголовочный файл, а не во второй файл исходного кода, то всё проходит нормально. Но если создать второй файл исходного кода (с этим заголовочным файлом) и в нём использовать шаблон, то компоновщик выдаёт ошибку:fatal error LNK1169: обнаружен многократно определенный символ - один или более. Это из за того, что определения шаблона и специализации присутствуют (через заголовочный файл) и в первом файле и во втором. Как правильно это всё делается? С функциями получается, а с шаблонами непонятно как правильно делать.
0
|
||||||||||||||||
| 22.09.2011, 05:22 | |
|
Ответы с готовыми решениями:
5
Как правильно разделить файл исходного кода? Rак правильно подключать файлы с шаблонами Как правильно разделить жесткий диск? |
|
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,308
|
|
| 22.09.2011, 05:31 | |
|
Для шаблонов определение и реализация должны быть в одном файле.
0
|
|
|
Заблокирован
|
|
| 22.09.2011, 05:44 | |
|
когда компилятор видит шаблонную функцию он должен знать для каких аргументов его инстанцировать. То есть если у тебя определение шаблона и его вызов находятся в разных файлах(.Cxx), то ничего не получится, компилер не инстанцирует шаблон, а просто создаст ссылку на определение, которую должен разрешить компоновщик, но так как ничего не инстанцированно, то линкер в свою очередь лажает.
В учебной программе можешь не париться и писать всё в хидере, слишком сильно это время компиляции не увеличит, а для больших проектов существуют предкомпильные заголовки. Ещё как вариант можно явно инстанцировать всё что нужно в конце файла реализации и при этом следить, чтобы не проинтанцировать чтото дважды для одних и тех же параметров, иначе линкер опять обругается
0
|
|
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||||||||||||||||||||||||||
| 22.09.2011, 07:38 [ТС] | ||||||||||||||||||||||||||
|
Я в этих определениях уже запутался: прототип, объявление, определение, реализация... Ты ещё добавил инстанцировать (инстанация?). Если я правильно понимаю, то это означает создать экземпляр функции по шаблону? Писать всё в хидере не годится. Вернее, годится, если файл исходного кода один, а если не один и во втором тоже вызывается шаблонная функция, то компоновщик выдаёт двойное определение: fatal error LNK1169: обнаружен многократно определенный символ - один или более. Получается так, что если имеется несколько файлов исходного кода, в которых есть вызов шаблонной функции, то прототип шаблона должен присутствовать в каждом файле, а реализация шаблона только в одном. У меня так получилось: в одном заголовочном файле прототип шаблона и специализации, в другом заголовочном - реализация шаблона и специализации. Заголовочный с прототипами подключается к каждому файлу исходного кода (где есть вызоа шаблонной функции), а заголовочный с реализациями шаблона и специализации, только к первому файлу исходного кода.
Первый заголовочный "proba.h":
0
|
||||||||||||||||||||||||||
|
Заблокирован
|
|
| 22.09.2011, 09:14 | |
|
в итоге ты вернулся к модели включения. Никакого смысла так разделять файлы нет, только ещё больше всё запутал
1
|
|
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
| 22.09.2011, 18:43 [ТС] | |
|
Согласен, что смысла нет. До настоящих смыслов я ещё не дошёл. Дошёл до главы "Раздельная компиляция". Там пишется:"...Таким образом, исходную программу можно разбить на три части:
- Заголовочный файл, содержащий объявления структур и прототипы функций, использующих эти структуры. - Файл с исходным кодом, содержащий код функций, работающих со структурами. - Файл с исходным кодом, содержащий код, осуществляющий вызовы этих функций... Ещё:"...В заголовочных файлах обычно содержатся следующие элементы: - Прототипы функций. - Символьные константы, определённые с помощью директивы #define или const. - Объявления структур. - Объявления классов. - Объявления шаблонов. - Встроенные функции..." Стал пробовать. С функциями, структурами всё получилось, а с шаблонами нет. Разделил прототип шаблона и определение его (как с функциями делал) не получается. Вот и возник вопрос. Написано, что в заголовочном следует разместить объявление шаблона. Под этим, скорее всего, подразумевается прототип шаблона вместе с определением. Добавлено через 1 час 11 минут Вроде бы разобрался. Получается так. Когда компилятор встречает в каком-либо файле исходного кода вызов шаблонной функции с некими аргументами, то он создаёт экземпляр этой функции под этот тип аргументов, а для этого, в этом файле должно присутствовать определение шаблона (получается, что у определения шаблона видимость в пределах файла). После этого, если компилятор встречает в другом файле исходного кода вызов шаблонной функции с таким же типом аргументов, то он использует ранее созданный экземпляр функции, и поэтому в этом файле ему уже не нужно определение шаблона (только прототип). Но что интересно, это не касается определения специализации шаблона. Она видна во всех файлах (внешнее связывание), и именно она давала ошибку двойного определения, если присутствовала в заголовочном файле и этот файл включался в несколько файлов исходного кода. Определение специализаци шаблона (так же как определения функций) нужно помещать в отдельный файл, а в заголовочном оставлять только прототипы и определения шаблонов. Тогда такой заголовочный файл можно включать в любое колличество файлов исходного кода.
1
|
|
| 22.09.2011, 18:43 | |
|
Помогаю со студенческими работами здесь
6
Как правильно разделить код по функциям Как правильно разделить код по функциям Как правильно разделить два числа Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
|
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
|
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут
Суть:
- Группа наркоманов из 10 человек.
- Только один инфицирован ВИЧ.
- Колются одной иглой.
- Колются раз в день.
- Колются последовательно через. . .
|
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
|
|
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|