2010-08-09 4 views
0
typedef struct 
{ 
    int y; 
    int weight; 
    struct edgenode * next; 
}edgenode; 

Этот код дает: 'edgenode' : redefinition; different basic typesC++ ошибка ЬурейеЕ и структура вопрос

Он отлично работает в коде C.

Почему? не

+0

C++ не "требует" такой 'typedef''ing. (И он имеет 'std :: list' или более подходящий' std :: vector' или 'std :: deque', вы не должны переделывать контейнеры.) – GManNickG

ответ

0

Название не указано для структуры, прежде чем определение типа во

typedef struct edgenode 
{ 
    int y; 
    int weight; 
    edgenode* next; 
}en; 
7

Поскольку ваша структура не имеет имени! Вопрос предполагает наследие 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; 
}; 
+0

@Martin (и GMan): Я реорганизовал, чтобы поставить C++ впереди C - и отметил, что у опроса, вероятно, есть фон C, потому что обозначение - это стиль C, а не стиль C++. Я вернулся, чтобы дважды проверить теги (и название); вопрос был похож на C, поэтому я добавил материал C++ в пару итераций. Теперь он организован лучше. Спасибо за подсказку. –

0

попробовать:

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; 
0

Разница между 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!! 
Смежные вопросы