class Moge;
class Hoge{
Moge moge;
};
class Moge{
};

int main(){
return 0;
}

↑のようなコードを書いてコンパイルしたところ、
「'Hoge::moge' が 未定義の class 'Moge' で使用しています」(VC8)
「未定義の構造体 'Moge'」(BCC5.5)
「field `moge' has incomplete type」(GCC)
のようなエラーを吐かれます。
また、
- Moge moge;
+ Moge* pMoge;
のように変更を加えたところ、何事もないようにコンパイルされます。

この違いはいったい何なのでしょうか。