Ответ 1
Шаблонные классы и функции не создаются, пока они не используются, как правило, в отдельном файле .cpp(например, в источнике программы). Когда шаблон используется, компилятору нужен полный код для этой функции, чтобы иметь возможность создавать правильную функцию с соответствующим типом. Однако в этом случае код для этой функции подробно описан в исходном файле шаблона и, следовательно, недоступен.
В результате всего этого компилятор просто предполагает, что он определен в другом месте и только вставляет вызов функции templated. Когда дело доходит до компиляции исходного файла шаблона, тип конкретного шаблона, который используется в исходном коде программы, не используется там, поэтому он все равно не будет генерировать код, необходимый для этой функции. Это приводит к неразрешенному внешнему символу.
Доступны следующие решения:
- включить полное определение функция-член в файл заголовка шаблона и не иметь исходный файл для шаблона,
- определить все функции-члены в исходный файл шаблона как "inline", или
-
определить участника функции в источнике шаблона с ключевым словом "экспорт". К сожалению, это не поддерживается много компиляторов.(Обновление: это было удалено из стандартного как С++ 11.)
Оба 1 и 2 в основном решают проблему, предоставляя компилятору доступ ко всему коду для шаблонной функции, когда он пытается построить типизированную функцию в исходном коде программы.