¿Son posibles las definiciones de tipo recursivo de C ++, en particular, ¿puedo poner un vector dentro de la definición de T?

Para uno de mis proyectos, lo que realmente quería hacer era esto (simplificándolo al mínimo);

struct Move { int src; int dst; }; struct MoveTree { Move move; std::vector variation; }; 

Debo admitir que asumí que no sería posible hacerlo directamente, pensé que un vector de MoveTree dentro de un MoveTree estaría prohibido. Pero lo intenté de todos modos, y funciona muy bien. Estoy usando Microsoft Visual Studio 2010 Express.

¿Es esto portátil? ¿Es una buena práctica? ¿Tengo algo de qué preocuparme?

Editar: He hecho una segunda pregunta con la esperanza de encontrar una buena manera de hacerlo.

El Estándar de C ++ (2003) dice claramente que al instanciar un contenedor estándar con un tipo incompleto, se invoca un comportamiento indefinido.

La especificación dice en §17.4.3.6 / 2,

En particular, los efectos no están definidos en los siguientes casos:

__ [..]
– si se utiliza un tipo incompleto (3.9) como argumento de plantilla al crear una instancia de un componente de plantilla.
__ [..]

MoveTree es un tipo incompleto dentro de su definición. El estándar no garantiza la instanciación de plantillas STL con tipos incompletos.

Use un puntero al tipo en el Vector, esto será portátil.

 struct Move { int src; int dst; }; struct MoveTree; struct MoveTree { Move move; std::vector variation; }; 

Los elementos MoveTree en std::vector están en una matriz asignada (como en la new [] ). Solo la información de control (el puntero a la matriz, el tamaño, etc.) se almacena dentro del std::vector dentro de MoveTree .

No, no es portátil. codepad.org no lo comstack.

 t.cpp:14: instantiated from here Line 215: error: '__gnu_cxx::_SGIAssignableConcept<_tp>::__a' has incomplete type comstacktion terminated due to -Wfatal-errors. 

Debe definir constructores de copia y operadores de asignación para Move y MoveTree cuando usa vector, de lo contrario usará los generados por el comstackdor, lo que puede ocasionar problemas.