Разница между C и C ++ заключается в том, что они по-разному обрабатывают имена struct-names и typedef. В C вы не можете ссылаться на структуру без использования ключевого слова "struct" , если только не создаст имя typedef, которое разрешается в имя структуры. Следовательно, это действительно в C, но не в C ++:
struct A {};
typedef int A;
int main()
{
A a;
struct A a;
}
структуры и typedefs живут в другом пространстве имен, если хотите. Однако в C ++ имена struct и typedef входят в одно и то же пространство имен. Может быть только one A, и поэтому этот пример не компилируется. Так как это относится к вашему примеру? Давайте прочитаем это способом C:
typedef struct // Here's an unnamed struct
{
int y;
int weight;
struct edgenode * next; // Oh, yes points to some struct called "edgenode" that we don't know of
}edgenode; // and we want to refer to this structs as "edgenode"
Это объявление фактически создало две вещи, называемые edgenode: typedef (для неназванной структуры) и неполный тип "struct edgenode", который нигде не определен. Вы заметите, что edgenode x; x.next->y
не будет компилироваться.
Вот как C ++ читает это:
typedef struct // Here's an unnamed struct
{
int y;
int weight;
struct edgenode * next; // Oh, yes points to some struct called "edgenode" that we don't know of
}edgenode; // and we want to refer to this as "edgenode"..HEY WAITASECOND! There's already SOME OTHER THING named edgenode. We know this, because "next" mentioned it!!