Ao criar uma nova classe de modelo, você pode colocar a implementação da classe em um arquivo cpp separado, desde que crie uma instanciação trivial dessa classe dentro dele.
Normalmente, os métodos da classe de modelo são implementados no cabeçalho:
// foo.h
#ifndef FOO_H
#define FOO_H
template<typename T> class Foo {
public:
Foo(T bar);
};
template<typename T> Foo<T>::Foo(T bar) {}
#endif
Para grandes classes de modelo, isso pode resultar em arquivos de cabeçalho complicados. Mas você pode separar as implementações do método em um arquivo cpp separado se fizer isso:
// foo.h
#ifndef FOO_H
#define FOO_H
template<typename T> class Foo {
public:
Foo(T bar);
};
#endif
// foo.cpp
#include "foo.h"
template<typename T> Foo<T>::Foo(T bar) {}
// At end of file
template class HeapTree<int>; // Explicit instantiation