Il tuo collega ha torto, il modo comune è ed è sempre stato quello di inserire il codice nei file .cpp (o qualunque estensione ti piaccia) e le dichiarazioni nelle intestazioni.
Occasionalmente c'è qualche merito nel mettere il codice nell'intestazione, questo può consentire un allineamento più intelligente da parte del compilatore. Allo stesso tempo, può distruggere i tempi di compilazione poiché tutto il codice deve essere elaborato ogni volta che viene incluso dal compilatore.
Infine, è spesso fastidioso avere relazioni a oggetti circolari (a volte desiderate) quando tutto il codice è rappresentato dalle intestazioni.
In conclusione, avevi ragione, ha torto.
EDIT: Ho pensato alla tua domanda. C'è un caso in cui ciò che dice è vero. modelli. Molte nuove librerie "moderne" come boost fanno un uso pesante di modelli e spesso sono "solo intestazione". Tuttavia, questo dovrebbe essere fatto solo quando si tratta di modelli in quanto è l'unico modo per farlo quando si tratta di loro.
MODIFICARE: Alcune persone vorrebbero un po 'più di chiarimenti, ecco alcuni pensieri negativi a scrivere il codice "solo intestazione":
Se cerchi in giro, vedrai molte persone che cercano di trovare un modo per ridurre i tempi di compilazione quando si tratta di boost. Ad esempio: Come ridurre i tempi di compilazione con Boost Asio , che sta vedendo una compilazione 14s di un singolo file 1K con boost incluso. 14s potrebbe non sembrare "esploso", ma è sicuramente molto più lungo del normale e può sommarsi abbastanza rapidamente. Quando si tratta di un grande progetto. Le librerie solo intestazione influiscono sui tempi di compilazione in modo abbastanza misurabile. Lo tolleriamo solo perché boost è così utile.
Inoltre, ci sono molte cose che non possono essere fatte solo nelle intestazioni (anche boost ha librerie a cui devi collegarti per alcune parti come thread, filesystem, ecc.). Un esempio principale è che non è possibile avere oggetti globali semplici nelle librerie solo dell'intestazione (a meno che non si ricorra all'abominio che è un singleton) poiché si verificheranno errori di definizione multipla. NOTA: le variabili inline di C ++ 17 renderanno possibile questo esempio particolare in futuro.
Come ultimo punto, quando si utilizza boost come esempio di codice solo intestazione, spesso si perde un enorme dettaglio.
Boost è una libreria, non un codice a livello di utente. quindi non cambia così spesso. Nel codice utente, se metti tutto nelle intestazioni, ogni piccola modifica ti costringerà a ricompilare l'intero progetto. È una perdita di tempo monumentale (e non è il caso delle biblioteche che non cambiano da compilazione a compilazione). Quando dividi le cose tra intestazione / sorgente e ancora meglio, usa le dichiarazioni in avanti per ridurre le inclusioni, puoi risparmiare ore di ricompilazione una volta sommate in un giorno.