Когда компилятор читает ваш файл, он ожидает объявленные сущности.
Вы можете переслать объявление класса, но вы пропустите тип вложенных параметров.
То, что вы можете сделать, это иметь третий класс, который нарушает циклическую зависимость и наследует ваши вложенные классы:
class NestedBase {
};
Теперь используйте эту базу в вашем вложенном классе A:
#include "NestedBase.h"
class A {
public:
class Nested : public NestedBase {
public:
void foo(NestedBase &foo);
};
};
И в вашем вложенном классе B а также:
#include "NestedBase.h"
class B {
public:
class Nested : public NestedBase {
public:
void foo(NestedBase &foo);
};
};
Теперь с dynamic_cast
в ваших реализациях методов вы можете преобразовать их в нужные вам типы и получить доступ ко всему, что вы объявили в своих вложенных классах.
#include "A.h"
#include "B.h"
B::Nested::foo(NestedBase &foo)
{
auto &fooA = dynamic_cast<A::Nested&>(foo);
...
}