1) Нет, неважно, как вы структурируете свой код.Кстати, Singleton
- это не класс: это шаблон .Так как полное определение шаблона в любом случае должно быть доступно на любом сайте создания экземпляра, вы можете также определить все встроенное.
2) class DebugLog : public Singleton<DebugLog>
хорошо.Мы не наследуем от несуществующего класса;скорее мы наследуем от класса Singleton<DebugLog>
.Шаблоны могут быть созданы на неполных типах.(Есть несколько правил, которые вы можете и не можете делать с таким параметром типа.)
Например, template <typename T> class Foo { };
, безусловно, может быть создан для любого типа без проблем.Что еще интереснее, template <typename T> struct PointerFactory { typedef T * type; };
может быть создан для любого типа, полный или нет.В данной ситуации цель параметра шаблона в CRTP состоит исключительно в информировании базового класса о его возможном производном типе, так что это вполне нормально.