Ваша проблема в обоих случаях заключается в определении структуры: struct list *next
не относится к структуре, в которой вы находитесь в процессе объявления. Попробуйте вместо этого:
typedef struct list {
item_type item;
struct list* next;
} list;
Кроме того, в C ++ вы должны приводить void *
, возвращаемый malloc
, к соответствующему типу указателя (list *
), C ++ более строг в этих вещах. Кроме того, кстати, в C ++ вы можете полностью исключить typedef, если хотите.
Причиной различий в сообщениях об ошибках является различие в языках.
В Си компилятор знает, что struct list *
является указателем на структуру, поэтому ему не нужно жаловаться, что он на самом деле не знает, что такое "список структуры". Однако позже, когда вы пытаетесь присвоить этот «список структуры *» из указателя типа «список *» (типом которого является «указатель на анонимную структуру»), он жалуется на несоответствие.
В C ++ объявление "struct" более или менее эквивалентно объявлению "class" (основное отличие заключается в видимости членов по умолчанию). Среди прочего, это означает, что структуры в C ++ более или менее автоматически определяются по типу. Поэтому, когда компилятор видит «struct list * next», он воспринимает это как предварительное объявление класса с именем «list»; затем, когда он заканчивает оператор и обрабатывает typedef, выдает ошибку, потому что вы пытаетесь что-то определить с помощью идентификатора, который уже (forward-) объявлен как что-то еще. Затем он выдает дополнительные ошибки, потому что фактически не знает, что может быть «список», из-за более ранней ошибки.