Ваш пример верный, но не очень переносимый. Существует также немного более чистый синтаксис, который можно использовать (как указано @ namespace-sid).
Предположим, что шаблонный класс является частью некоторой библиотеки, которая должна использоваться совместно. Нужно ли компилировать другие версии шаблонного класса? Должен ли сопровождающий библиотеки предвидеть все возможные шаблонные применения класса?
Альтернативный подход - это небольшое изменение того, что у вас есть: добавьте третий файл, который является файлом реализации / создания шаблона.
foo.h file
// Standard header file guards omitted
template <typename T>
class foo
{
public:
void bar(const T& t);
};
Файл foo.cpp
// Always include your headers
#include "foo.h"
template <typename T>
void foo::bar(const T& t)
{
// Do something with t
}
файл foo-impl.cpp
// Yes, we include the .cpp file
#include "foo.cpp"
template class foo<int>;
Единственное предостережение: вам нужно указать компилятору компилировать foo-impl.cpp
вместо foo.cpp
, так как компиляция последнего ничего не делает.
Конечно, у вас может быть несколько реализаций в третьем файле или несколько файлов реализации для каждого типа, который вы хотите использовать.
Это обеспечивает большую гибкость при совместном использовании шаблонного класса для других целей.
Эта настройка также сокращает время компиляции для повторно используемых классов, поскольку вы не перекомпилируете один и тот же заголовочный файл в каждой единице перевода.