Из того, что мне сказал кто-то из моего класса разработки компиляторов, gcc делает один проход, тогда как другие компиляторы, такие как используемые Visual Studio (по умолчанию), используют два прохода. Вот почему вы должны заранее объявить классы в c ++, если вы используете их в циклическом режиме.
Class A {
B* b;
}
Class B {
A* a;
}
C # и другие языки не требуют этого, так как первый проход строит ссылки, а второй проход компилируется.
Но опять же я не эксперт в компиляторах.