typedef struct
{
int y;
int weight;
struct edgenode * next;
}edgenode;
Этот код дает: 'edgenode' : redefinition; different basic types
C++ ошибка ЬурейеЕ и структура вопрос
Он отлично работает в коде C.
Почему? не
typedef struct
{
int y;
int weight;
struct edgenode * next;
}edgenode;
Этот код дает: 'edgenode' : redefinition; different basic types
C++ ошибка ЬурейеЕ и структура вопрос
Он отлично работает в коде C.
Почему? не
Название не указано для структуры, прежде чем определение типа во
typedef struct edgenode
{
int y;
int weight;
edgenode* next;
}en;
Поскольку ваша структура не имеет имени! Вопрос предполагает наследие C - код написан так, как я его напишу.
Чистый C++ Решение:
struct edgenode
{
int y;
int weight;
edgenode *next;
};
Это не будет работать в C. В C, и в соответствии с вопросом, можно было бы написать:
typedef struct edgenode
{
int y;
int weight;
struct edgenode * next;
} edgenode;
Теперь ваша структура имеет имя - struct edgenode
. Разумеется, для него также существует typedef - edgenode
, но компилятор не знает об этом имени, пока не достигнет конечной полуколонии (приблизительно). не Вы могли бы также написать:
typedef struct edgenode edgenode;
struct edgenode
{
int y;
int weight;
edgenode *next;
};
@Martin (и GMan): Я реорганизовал, чтобы поставить C++ впереди C - и отметил, что у опроса, вероятно, есть фон C, потому что обозначение - это стиль C, а не стиль C++. Я вернулся, чтобы дважды проверить теги (и название); вопрос был похож на C, поэтому я добавил материал C++ в пару итераций. Теперь он организован лучше. Спасибо за подсказку. –
попробовать:
struct edgenode
{
int y;
int weight;
edgenode* next;
};
В C++ это больше не требуется использовать ЬурейеЕ на STRUCT узлах.
Также способ, которым вы его использовали (для C), был неправильным. если вы ввели его, то больше не нужно использовать структуру.
В C вы имели TODO:
// In C:
struct X {};
struct X a;
// C with typedef (Notice here that the struct is anonymous)
// Thus it is only accessible via the typedef (but you could give it a name)
typedef struct {} X;
X a;
// In C++ the use of struct is no longer required when declaring the variable.
struct Y {};
Y a;
Разница между C и C++ в том, что они относятся к STRUCT-имена и имена TYPEDEF по-разному. В C вы не можете ссылаться на структуру, не используя ключевое слово «struct» , если только не создает имя typedef, которое разрешает имя структуры. Поэтому это справедливо в C, но не в C++:
struct A {};
typedef int A;
int main()
{
A a;
struct A a;
}
и Структура определение типов живут в другом пространстве имен, если вы хотите. Однако в C++ имена struct и typedef входят в одно и то же пространство имен. Может быть только один 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: ЬурейеЕ (для безымянного структуры) и неполный тип «структура 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!!
C++ не "требует" такой 'typedef''ing. (И он имеет 'std :: list' или более подходящий' std :: vector' или 'std :: deque', вы не должны переделывать контейнеры.) – GManNickG