У меня проблемы с придуманием хорошего имени для этого вопроса, и я прошу прощения за это. Если после прочтения у вас есть лучшее имя, пожалуйста, дайте мне знать. В любом случае, у меня есть код, подобный следующему:
// BaseFamily.h
template<typename T>
class BaseChild {
T parent;
}
class BaseParent {
virtual BaseChild<BaseParent>* createChild() = 0;
}
.
// DerivedFamily.h
class DerivedParent;
class DerivedChild: public BaseChild<DerivedParent> {}
class DerivedParent
: public BaseParent
{
BaseChild<BaseParent>* createChild() override {
return new DerivedChild();
// error: Cannot initialize return object of type 'BaseChild<BaseParent> *' with an rvalue of type 'DerivedChild *'
}
}
Выше два набора родительских <-> дочерних циклических ссылок. Кроме того, последний набор наследует от бывшего родителя и потомка. Одна из вещей, унаследованных, - это функция для создания дочернего элемента, которая переопределяется для возврата DerivedChild вместо BaseChild.
Кажется, что он должен быть по крайней мере близок к работе, так как указатель на BaseChild должен уметь обрабатывать указание на DerivedChild, но, похоже, они не взаимозаменяемы с любым известным мне синтаксисом.
Чтобы задать вопрос: Как создать функцию типа возврата BaseChild<BaseParent>*
, которая разрешит DerivedChild<DerivedParent>*
?
РЕДАКТИРОВАТЬ: Я мог найти подсказку классы шаблона деривации . Но не похоже, что CRTP решит эту проблему.