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

Ce code donne erreur: 'edgenode' : redefinition; different basic typesC++ typedef et question struct

Il fonctionne très bien dans le code C.

Pourquoi?

+0

C++ n'a pas "besoin" comme 'typedef''ing. (Et il a 'std :: list' ou plus exactement' std :: vector' ou 'std :: deque', vous ne devriez pas refaire des conteneurs. – GManNickG

Répondre

0

Aucun nom spécifié pour votre struct avant typedef

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

Parce que votre struct n'a pas de nom! La question suggère un héritage C - le code est écrit comme je l'écrirais.

Le pur C++ solution est:

struct edgenode 
{ 
    int  y; 
    int  weight; 
    edgenode *next; 
}; 

Cela ne fonctionnera pas en C. En C, et conformément à la question, vous pouvez écrire:

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

Maintenant, votre struct a un nom - struct edgenode. Il y a aussi un typedef, bien sûr - edgenode, mais le compilateur ne connaît pas ce nom jusqu'à ce qu'il atteigne le point-virgule final (environ). Vous pouvez aussi écrire:

typedef struct edgenode edgenode; 
struct edgenode 
{ 
    int  y; 
    int  weight; 
    edgenode *next; 
}; 
+0

@Martin (et GMan): Je me suis réorganisé pour mettre C++ en avant de C - et j'ai noté que le questionneur a probablement un fond C parce que la notation est de style C et non de style C++. Je suis retourné pour vérifier les tags (et le titre); la question ressemblait à C, j'ai donc ajouté le contenu C++ dans quelques itérations. Maintenant, il est mieux organisé. Merci pour l'indice. –

0

essayer:

struct edgenode 
{ 
    int  y; 
    int  weight; 
    edgenode* next; 
}; 

En C++, il est plus nécessaire d'utiliser le typedef sur les nœuds struct.
La façon dont vous l'utilisiez (pour C) était erronée. Si vous le typedef alors il n'y a plus besoin d'utiliser struct.

En C vous aviez 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

La différence entre C et C++ est, qu'ils traitent struct noms et noms typedef différemment. En C, vous ne pouvez pas faire référence à une structure sans utiliser le mot-clé "struct" sauf si vous créez un nom typedef qui résout le nom de la structure. Par conséquent, cela est valable en C, mais pas en C++:

struct A {}; 
typedef int A; 

int main() 
{ 
A a; 
struct A a; 
} 

struct et typedefs vivent dans un autre espace de noms si vous voulez. Cependant, en C++, les deux noms struct et typedef vont dans le même espace de noms. Il peut y avoir seulement un A et par conséquent cet exemple ne compile pas. Alors, comment cela s'applique à votre exemple? Lisons la voie 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" 

Cette déclaration fait créé deux choses appelées edgenode: Un typedef (pour le struct sans nom) et un type incomplet « struct edgenode » qui est définie nulle part. Vous remarquerez que edgenode x; x.next->y ne compilera pas.

Voilà comment lit C++ il:

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!!