typedef struct
{
int y;
int weight;
struct edgenode * next;
}edgenode;
Ce code donne erreur: 'edgenode' : redefinition; different basic types
C++ typedef et question struct
Il fonctionne très bien dans le code C.
Pourquoi?
typedef struct
{
int y;
int weight;
struct edgenode * next;
}edgenode;
Ce code donne erreur: 'edgenode' : redefinition; different basic types
C++ typedef et question struct
Il fonctionne très bien dans le code C.
Pourquoi?
Aucun nom spécifié pour votre struct avant typedef
typedef struct edgenode
{
int y;
int weight;
edgenode* next;
}en;
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;
};
@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. –
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;
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!!
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