Ответ на этот вопрос зависит от компилятора. Некоторые версии компилятора Sun C ++ будут обрабатывать это автоматически, создавая кэш реализаций шаблонных функций, которые будут совместно использоваться отдельными модулями перевода.
Если вы используете Visual C ++ и любой другой компилятор, который не может этого сделать, вы также можете поместить определение функции в заголовок.
Не беспокойтесь о дублированных определениях, если заголовок включен в несколько файлов .cc. Компилятор помечает сгенерированные шаблоном методы специальным атрибутом, чтобы компоновщик знал, что нужно отбрасывать дубликаты вместо жалоб. Это одна из причин, почему в C ++ действует «одно правило определения».
Редактировать: Вышеприведенные комментарии применяются в общем случае, когда ваш шаблон должен быть способен связывать данные любых параметров типа. Если вы знаете закрытый набор типов, которые будут использовать клиенты, вы можете убедиться, что они доступны, используя явное создание экземпляра в файле реализации шаблона, что заставит компилятор генерировать определения для ссылок на другие файлы. Но в общем случае, когда ваш шаблон должен работать с типами, которые, возможно, известны только клиенту, нет смысла разделять шаблон на файл заголовка и файл реализации; любой клиент должен включать обе части в любом случае. Если вы хотите изолировать клиентов от сложных зависимостей, спрячьте эти зависимости за не шаблонными функциями, а затем вызовите их из кода шаблона.