Welcome to Stratos!
Simplemente que, en el primer modo, el compilador aún no sabe qué es eso de MiEstructura (el del puntero que pones en negrita) hasta que termina de procesar todo lo que hay entre llaves. En el segundo modo ya sabe algo de ese tipo desde el principio.Se me olvidaba: nada te impide hacer el typedef delante de tu segunda alternativa.
typedef struct{ string nombre; string apellidos; MiEstructura *siguiente;}MiEstructura;
typedef struct MiEstructura{ string nombre; string apellidos; MiEstructura *siguiente;}MiEstructura;
typedef struct FooBar{ string nombre; string apellidos; FooBar*siguiente;}MiEstructura;
#include <iostream>using namespace std;struct MiEstructura{ string nombre; string apellidos; MiEstructura *siguiente;};int main(int argc, char** argv){ MiEstructura miEstructuraA; miEstructuraA.nombre = "Foo A"; miEstructuraA.apellidos = "Aar"; MiEstructura miEstructuraB; miEstructuraB.nombre = "Foo B"; miEstructuraB.apellidos = "Bar"; miEstructuraB.siguiente = 0; miEstructuraA.siguiente = &miEstructuraB; std::cout << "miEstructuraA.nombre = " << miEstructuraA.nombre.c_str() << std::endl << "miEstructuraA.apellidos = " << miEstructuraA.apellidos.c_str() << std::endl << "miEstructuraA.siguiente->nombre = " << miEstructuraA.siguiente->nombre.c_str() << std::endl << "miEstructuraA.siguiente->apellidos = " << miEstructuraA.siguiente->apellidos.c_str() << std::endl; return 0;}
struct Foo {// ...};void Foo(int bar);
creo que el anterior comentario no es muy acertado , por no decir que no ha dado pie con bola ^_^'.
Bueno, se sobreentendía lo que quería decir.
Hi,CitarBueno, se sobreentendía lo que quería decir.Precisamente, si has sobreentendido algo de ese comentario es que no has entendido cual era el fallo, porque la explicacion dada en ese comentario esta mal. Por muy explicito que hubiera sido, esa no es la razon a tu problema.Estabas declarando una estructura sin nombre y compilandolo en C++ (a juzgar por el error de compilacion que te daba), pero no es que no estuviese encontrando el miembro MiEstructura dentro de la declaracion de MiEstructura (que como se ve en el ejemplo que te he puesto no tiene problemas en encontrolarlo). En C++ no puedes tener estructuras sin nombre(con las uniones si), a diferencia de C. Por lo que tu ejemplo compila en C pero no en C++. En C++ es obligatorio poner un nombre a la estructura. Tan sencillo como eso. En C++ usar el idiom del typedef es redundante.Un saudo,Ruben
struct { int r, b, g; } Color; //define una variable Color de la estructura sin nombrestruct Color { int r, b, g; }; //define una estructura con nombre Colorstruct Color { int r, b, g; } Color1; //define una estructura con nombre Color y una variable Color1 de dicho tipotypedef struct { int r, b, g; } Color; //define una estructura sin nombre y le asigna alias Color para declarar variables luegotypedef struct Color { int r, b, g; } *PCOLOR; //define una estructura con nombre Color y le asigna alias PCOLOR para referirse a variables puntero de esta estructura