Implementação de modelo em arquivo .cpp

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