Personalmente ho sempre dubitato di queste fantomatiche: "regole di buona programmazione" da seguire alla lettera. Mi danno l'impressione di essere solo accademia e comunque ognuno ha le sue (e spesso copiate da altri).
Nel tuo caso hai già separato interfaccia e implementazione.
codice:
// Interfaccia
class Prova
{
public:
template <typename T>
void print( const T ) const;
};
// Implementazione.
template <typename T>
inline void Prova::print( const T c ) const
{
cout << c << endl;
}
(Metti inline altrimenti avrai errori di linking se l'unità è inclusa in più unità di compilazione).
Quello che dici è essenzialmente corretto, ma solo se non si tratta di template. Con i template sei costretto a mettere tutto in un file header; al massimo puoi scrivere l'implementazione in un file che andrà incluso nell'header stesso.
codice:
class Prova
{
public:
template <typename T>
void print( const T ) const;
};
#include "Provaimpl.estensione_a_piacere"
codice:
// file Provaimpl.estensione_a_piacere
template <typename T>
inline void Prova::print( const T c ) const
{
cout << c << endl;
}
ma per il compilatore è come scrivere il tutto in un unico file .h