Во всяких учебниках и туториалах прописано, что при конкретизации (создания из трафарета функции или класса конкретной функции или класса с конкретными подставленными типами) шаблона, гарантируется что один и тот же шаблон для определенного типа конкретизируется только один раз, независимо от того, в каких модулях (файлы ли это имеются ввиду???) происходит эта конкретизация. Но как компилятор выстраивает этот процесс конкретизации, если компиляция файлов происходит по отдельности???
Например:
у нас существует файл с определением шаблона, например, функции (для простоты) Пусть он называется template_definition.h
имеются так же файлы template_user_first.cpp и template_user_second.cpp. В оба этих файлв мы подключаем наш шаблон (include template_definition.h), а так же вызываем определенную шаблонную функцию с типом параметра, скажем int (в обеих файлах с одним и тем же типом параметра int, соответственно). Поскольку компилятор обрабатывает файлы по отдельности, то при препроцессинге template_user_first.cpp, он вставляет в него определение шаблона, конкретизирует его для типа параметра int и компилирует получившийся код инстанции шаблона, как часть объектного файла template_user_first.obj. Однако же, когда компилятор приступает к компиляции файла template_user_second.cpp, то он, по идее, забывает о том, что уже конкретизировал шаблон функции типом int и откомпилировал обьектный код.
Из этого размышления следует что шаблон конкретизируется два раза, мало того, если бы происходило так (а так ли это???), то при линковке, линковщик бы встретил одну и ту же функцию, определенную дважды!
Возможно компилятор, при компиляции пачки файлов имеет некий кэш для конкретизаций шаблонов (первое что приходит в голову), но если так, то при раздельной компиляции и линковке существует возможность того, что в финальной слинкованной программе не окажется определения необходимой функции, ведь она была конкретизирована в файле, который не был включен в линковку впоследствии.
В общем, повторяю вопрос после всего описанного: Как в реальности происходит данный процесс компиляции и конкретизации шаблонов?!
Все правильно, компилятор делает по определению функции в каждой из единиц трансляции, а линковщик произвольно выбирает из двух.
гарантируется что один и тот же шаблон для определенного типа конкретизируется только один раз
В отличие от некоторых других языков, в С++ ничего такого не гарантируется. Ситуация, когда определения одной и той же шаблонной функции в разных единицах трансляции отличаются, является Неопределённым Поведением.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Время жизни переменных, которые передают в область захвата(в квадратные скобки) лямбды-функции по значению
В общемЕсть задача Так же есть вот такой код размещения '*' Число логически в голове крутится версия проще ( с помощью abs()) Но никак не могу продумать...
В С++ для атрибутов класса можно задавать свойства, шаблон определения которых -