Я решил это, убрав необходимость использовать shared_ptr из Impl.
Основной проблемой было то, что Интерфейс является Узлом в ориентированном ациклическом графе.Каждый узел знает своих родителей и потомков, поэтому реализация Node :: addChild (shared_ptr child) невозможна, поскольку узел не может быть добавлен как parent_ptr к дочерним родителям.
Одним из способов является использованиеintrusive_ptr, но я решил это с помощью статического метода Node :: link (shared_ptr parent, shared_ptr child) на данный момент.
Я мог бы в конечном итоге использовать intrusive_ptr, если мне понадобитсяenable_shared_from_this-like операция.