Методы класса шаблона НЕ ДОЛЖНЫ быть определены в заголовочных файлах.Но если вы сделаете это, вам нужно определить отдельный модуль компиляции (например, templates.cpp) и включить файл исходного кода класса шаблона (например, #include "container.cpp" // .cpp НЕ.hpp file), тогда вам нужно определить экземпляры шаблонов, которые вы используете (например, шаблон класса Container;).Вам также необходимо определить объект для класса шаблона (например, Link).В данном конкретном случае, поскольку мы используем указатель на этот объект (например, Link *, в контейнере), нам просто нужно «объявить вперед» этот объект.
Вот полный файл template.cpp.Который вы бы скомпилировали и связали с остальным кодом.
class Link;
#include "Container.cpp" // use the source code, not the header
template class Container<Link*>;
Мне нравится использовать этот метод, потому что он не позволяет компилятору автоматически генерировать экземпляры класса шаблона и позволяет узнать, когда он не может его найти.
Скомпилируйте с помощью gcc, используя опцию -fno-implicit-templates.
При сборке все будет скомпилировано как обычно, но затем сборщик перекомпилирует файл templates.cpp для всех объектов, которые используют шаблон.