В ServiceCreator::create()
вы делаете это:
servicePtr->service.reset(new T);
Если T
равно S
, это попытается создать S
, но не удастся, поскольку S
имеет защищенный конструктор.Чтобы позволить несвязанному классу получить доступ к этому конструктору, сохраняя при этом его защиту, вы должны сделать класс создателя (или просто функцию-член, которой требуется доступ) другом:
friend ServiceCreator<S>::create;