構造体にタグ名を付けない場合は、
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->left
node