Вам необходимо записать определения шаблонных методов в файл .hxx и включить его в конец файла заголовка (.hh), в котором вы его объявили..Cc / .cpp используется для определения не шаблонных методов.
Таким образом, у вас будет один .hh, один .hxx (включенный в конце .hh) и один .cc;так что, включая ваш шаблонный заголовочный файл класса, будет также включено его определение.
Пример:
// list.hh
#IFNDEF LIST_HH
# DEFINE LIST_HH
template <typename T>
class List
{
void fun1(T a);
void fun2();
}
# include "list.hxx"
#ENDIF
// list.hxx
#IFNDEF LIST_HXX
# DEFINE LIST_HXX
# include "list.hh"
template <typename T>
void List::fun1(T a)
{
// ...
}
#ENDIF
// list.cc
#include "list.hh"
void List::fun2()
{
// ...
}
// anywhere.cc
#include "list.hh"
// ...
EDIT
Существует несколько стратегий компиляциишаблоны.Наиболее распространенная стратегия - это описанная выше, позволяющая каждому пользователю шаблона класса создавать экземпляр кода.
Но, поскольку файл * .hh включает файл * .hxx, каждый раз при простом объявлении шаблонанеобходимо, полная реализация идет с этим.И если для реализации требуются другие объявления, такие как std :: string, вы заставляете весь клиентский код анализировать заголовок строки.
Чтобы избежать создания экземпляров несколько раз (занимая время и пространство), вы можете ввести четвертый типфайла, * .hcc: файлы, которые должны быть скомпилированы один раз для каждого конкретного параметра шаблона.
См. также зависимости во время компиляции
EDIT2
Запись определения шаблона непосредственно в заголовочный файл называется модель включения .Это увеличивает стоимость включения заголовка.Не только потому, что мы добавили определение шаблона, но и потому, что мы включили заголовки (что угодно), которые представляют тысячи строк. Реальная проблема для важных программ для компиляции (речь идет о часах компиляции здесь) .Модель разделения
Источник
И мой последний аргумент: оставьте файл заголовка чистым, чтобы он содержал только объявление класса и его документацию.Таким образом, любой другой программист может быстро прочитать ваш заголовочный файл: что такое открытый интерфейс этого класса, что говорится в документации.