Компилятор будет генерировать код для каждого экземпляра шаблона, когда вы используете шаблон на этапе компиляции.
В процессе компиляции и компоновки файлы .cpp преобразуются в чистый объектный или машинный код, который содержит ссылки или неопределенные символы, поскольку файлы .h, включенные в ваш main.cpp, не имеют реализации YET. Они готовы быть связаны с другим объектным файлом, который определяет реализацию для вашего шаблона, и, таким образом, у вас есть полный исполняемый файл a.out.
Однако, поскольку шаблоны необходимо обрабатывать на этапе компиляции, чтобы генерировать код для каждого экземпляра шаблона, который вы делаете в своей основной программе, связывание не поможет, потому что компиляция main.cpp в main.o, а затем компиляция вашего шаблона .cpp в template.o, и тогда связывание не достигнет цели шаблона, потому что я связываю инстанцирование другого шаблона с одной и той же реализацией шаблона! И шаблоны должны делать противоположное, т. Е. Иметь ОДНУ реализацию, но допускают множество доступных реализаций с использованием одного класса.
Значение typename T
get заменено на этапе компиляции, а не на этапе компоновки, поэтому, если я попытаюсь скомпилировать шаблон без замены T
в качестве конкретного типа значения, поэтому он не будет работать, поскольку это определение шаблонов. процесс компиляции, и, кстати, метапрограммирование - все об использовании этого определения.