Есть ли способ форвард объявить ковариацию?

Предположим, у меня есть эти абстрактные классыFoo а также :Bar

class Foo;
class Bar;

class Foo
{
public:
  virtual Bar* bar() = 0;
};

class Bar
{
public:
  virtual Foo* foo() = 0;
};

Предположим далее, что у меня есть производный классConcreteFoo а такжеConcreteBar, Я хочу ковариантно уточнить тип возвращаемого значенияfoo() а такжеbar() методы как это:

class ConcreteFoo : public Foo
{
public:
  ConcreteBar* bar();
};

class ConcreteBar : public Bar
{
public:
  ConcreteFoo* foo();
};

Это победилокомпилируется, так как наш любимый однопроходный компилятор не знает, чтоConcreteBar унаследует отBarи так чтоConcreteBar является совершенно легальным ковариантным типом возврата. Простое объявление впередConcreteBar тоже не работает, так как ничего не говорит компилятору о наследовании.

Является ли это недостатком C ++ I?Придется ли с этим мириться или действительно есть выход из этой дилеммы?

Ответы на вопрос(4)

Ваш ответ на вопрос