Я выбираю Num.3 (более детальную версию).Это больше печатать, но намерение точно для вас и для компилятора.Проблема, которую вы опубликовали как есть, на самом деле проще, чем в реальном мире.В реальном мире существуют другие области определения, а не только ученики.Ваши определения не очень сложны только с классами - потому что их область действия никогда не открывается (в отличие от пространств имен, глобальной области и т. Д.).
Num.1 это может не работать с областями, отличными от классов - что угодно, что может бытьвозобновлено.Таким образом, вы можете объявить новую функцию в пространстве имен, используя этот подход, или ваши строки могут быть заменены на ODR.Это понадобится вам для некоторых определений (в частности, для специализаций шаблонов).
Num.2 Это очень хрупко, особенно в больших кодовых базах - при смещении заголовков и зависимостей ваша программа не будет компилироваться.
Num.3 Это идеальный вариант, но его нужно много напечатать - ваше намерение - определить что-то .Это делает именно это, и компилятор включается, чтобы убедиться, что вы не ошиблись, определение не синхронизировано с его объявлением и т. Д.