Su compañero de trabajo está equivocado, la forma común es y siempre ha sido poner código en archivos .cpp (o cualquier extensión que desee) y declaraciones en los encabezados.
De vez en cuando hay algún mérito para poner código en el encabezado, esto puede permitir una alineación más inteligente por parte del compilador. Pero al mismo tiempo, puede destruir los tiempos de compilación ya que todo el código debe procesarse cada vez que el compilador lo incluye.
Finalmente, a menudo es molesto tener relaciones de objeto circulares (a veces deseadas) cuando todo el código son los encabezados.
En pocas palabras, tenías razón, él está equivocado.
EDITAR: He estado pensando en tu pregunta. Hay un caso donde lo que dice es cierto. plantillas. Muchas bibliotecas "modernas" más nuevas, como boost, hacen un uso intensivo de las plantillas y, a menudo, son "solo encabezado". Sin embargo, esto solo debe hacerse cuando se trata de plantillas, ya que es la única forma de hacerlo cuando se trata de ellas.
EDITAR: algunas personas les gustaría un poco más de aclaración, aquí hay algunas ideas sobre las desventajas de escribir el código "solo encabezado":
Si busca alrededor, verá que muchas personas intentan encontrar una manera de reducir los tiempos de compilación cuando se trata de impulsar. Por ejemplo: Cómo reducir los tiempos de compilación con Boost Asio , que está viendo una compilación de 14s de un solo archivo 1K con boost incluido. Puede que los 14 no parezcan "explotar", pero ciertamente es mucho más largo de lo normal y puede acumularse bastante rápido. Cuando se trata de un gran proyecto. Las bibliotecas de solo encabezado afectan los tiempos de compilación de una manera bastante medible. Simplemente lo toleramos porque el impulso es muy útil.
Además, hay muchas cosas que no se pueden hacer solo en los encabezados (incluso boost tiene bibliotecas a las que debe vincular ciertas partes, como subprocesos, sistema de archivos, etc.). Un ejemplo principal es que no puede tener objetos globales simples en las bibliotecas de encabezado solamente (a menos que recurra a la abominación que es un singleton) ya que se encontrará con múltiples errores de definición. NOTA: Las variables en línea de C ++ 17 harán posible este ejemplo en particular en el futuro.
Como punto final, cuando se usa boost como ejemplo de código de solo encabezado, a menudo se pierde un gran detalle.
Boost es una biblioteca, no un código de nivel de usuario. así que no cambia tan a menudo. En el código de usuario, si coloca todo en los encabezados, cada pequeño cambio hará que tenga que volver a compilar todo el proyecto. Esa es una pérdida de tiempo monumental (y no es el caso de las bibliotecas que no cambian de compilación a compilación). Cuando divide cosas entre encabezado / fuente y mejor aún, use declaraciones directas para reducir las inclusiones, puede ahorrar horas de recompilación cuando se suman a lo largo de un día.