【違いの分析】

1. 外部クラスを参照したい場合の書き方:
struct Data {
 struct Node* Node; // OK: Refers to Node at global scope
 ・・・
};

2. 内部クラスを参照したい場合の書き方:
struct Base {
 struct Data; // OK: Declares nested Data
 ・・・
};

【考察】
後者の方は、「『宣言子』を「何にも書かずに」、ただ不完全定義として、
「struct Data」と書いている。こういう独特の特徴的な書き方で、
新しいタグ名の導入と見なされているのではないか。

一方、前者の方は、 「struct Node」だけではなく、「*Node」という「宣言子」を
書いてしまっているので、新しいタグ名の導入とは見なされない気がする。


先日書いた、CRITICAL なんたらの例では、宣言氏を書いていたので、「1」
の方の扱いとなり、外部クラスの参照と見なされた・・・。