構造体にタグ名を付けない場合は、
struct node* left;
構造体定義で、新しい(不完全な)型を宣言しstruct nodeます。したがって、aが予期されているその(不完全な)型へのポインターをnode*渡すと、互換性のない型のポインターを渡すことになります。
定義する構造体に同じ型へのポインターであるメンバーがある場合、定義でその型に名前を付けることができる必要があるため、型はスコープ内にある必要があります。
名前を付けるstructと、タイプは-その時点から-スコープ内にあり、まだ完全ではありませんが、struct node(タグがの場合node)として参照できます。typedefが完了すると、その型は、struct nodeまたはnodeのいずれかを参照できます。
ただし、タグを指定しない場合struct、typedefが完了するまでタイプは匿名であり、それ以前に参照することはできません。そして、ラインが
struct node *left;
が検出され、参照するタイプstruct nodeが不明であり、その行が新しいタイプを宣言しますが、struct nodeその何も不明です。コンパイラには、その型を現在定義されている型に接続する理由はありません。したがって、その時点で、にstructは不明な不完全な型へのポインタであるメンバーが含まれています。さて、でinorderTraversal、あなたが電話するとき
inorderTraversal(p->left);
node *pの定義によるとnode、withp->leftは、未知の不完全な型へのポインタstruct nodeです。が実際にへのポインタにpなるように作成されている場合でも、それでも動作します(ただし、異なるタイプへのポインタの表現が異なるプラットフォームを除く)が、異なるタイプへのポインタが期待される1つのタイプへのポインタを渡します。 。1つのタイプが不完全であるため、予期されるタイプと互換性がありません。p->leftnode