Кстати как на практике это юзать? Типа в чём на практике фича разделения интерфейса и реализации?
Суть в том, что это компилируемые языки.
в .hpp определение
в .cpp сама логика программного модуля - этот файл указываешь при компиляции.
У тебя какая-то часть программы уже в объектнике, тебе остается её только прилинковать, но откуда мы знаем где брать тело ф-ции Х?
Из определения, конечно же, которое помещается в хедер файл. Само же тело ф-ции давно скопилировалось и готово к использованию.
Фичи сомнительные, если честно. Могу выделить только переносимость кода без перекомпиляции (на одной платформе).
А шаблоны не требует определения в source файле, потому что они компайлтайм и определяются в хедере. Поэтому, допустим, для класса X требуется x.hpp с объявлением и x.cpp с определением, то шаблон может обойтись одним *.hpp. Некоторые создают ещё один хедер *_impl.hpp где уже определяют шаблон и тем самым пытаются эмитировать *.cpp файл.
Как-то так