Ошибка несоответствия типов между `BaseChild <BaseParent>*` и `DerivedChild <DerivedParent>*` - PullRequest
0 голосов
/ 26 января 2019

У меня проблемы с придуманием хорошего имени для этого вопроса, и я прошу прощения за это. Если после прочтения у вас есть лучшее имя, пожалуйста, дайте мне знать. В любом случае, у меня есть код, подобный следующему:

// 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 решит эту проблему.

1 Ответ

0 голосов
/ 28 января 2019
class BaseParent; // forward declaration

class BaseChild{
public:
  BaseChild(BaseParent* parent_)
    :parent(parent_)
  {}
  BaseParent* parent;
}

class BaseParent {
  virtual BaseChild* createChild() = 0;
}

class DerivedParent;
class DerivedChild: public BaseChild {
public:
  DerivedChild(DerivedParent* parent)
    :BaseChild(parent)
  {}
}

class DerivedParent
  : public BaseParent
{
  BaseChild* createChild() override {
    return new DerivedChild();  
  }
}

Я не знаю контекста вопроса, поэтому я не уверен, полезно это или нет.

...