40 votes

Les définitions de type récursif C ++ sont-elles possibles, en particulier puis-je mettre un vecteur <T> dans la définition de T?

Pour un de mes projets, ce que je voulais vraiment faire était de ce (en simplifiant à l'extrême minimum);

struct Move
{
    int src;
    int dst;
};

struct MoveTree
{
    Move move;
    std::vector<MoveTree> variation;
};

Je dois avouer que j'ai supposé qu'il ne serait pas possible de le faire directement, j'ai pensé à un vecteur de MoveTree s dans un MoveTree serait verboten. Mais j'ai essayé quand même, et il fonctionne à merveille. Je suis l'aide de Microsoft Visual Studio 2010 Express.

Est-ce portable ? Est-il une bonne pratique ? Dois-je m'inquiéter de quelque chose ?

Edit: j'ai posé une deuxième question en espérant trouver une bonne façon de le faire.

35voto

Nawaz Points 148870

Le standard C ++ (2003) dit clairement que l'instanciation d'un conteneur standard avec un type incomplet, appelle un comportement indéfini.

La spécification dit au § 17.4.3.6 / 2,

En particulier, les effets ne sont pas définis dans les cas suivants:

__ [..]
- si un type incomplet (3.9) est utilisé comme argument de modèle lors de l'instanciation d'un composant de modèle.
__ [..]

5voto

Mehrdad Afshari Points 204872

MoveTree est un type incomplet dans sa définition. La norme ne garantit pas l'instanciation des modèles STL avec des types incomplets.

5voto

David Allan Finch Points 909

Utilisez un pointeur sur le type du vecteur, ce sera portable.

 struct Move
    {
        int src;
        int dst;
    };

struct MoveTree;

struct MoveTree
    {
        Move move;
        std::vector<MoveTree*> variation;
    };
 

2voto

Ben Jackson Points 28358

Les éléments MoveTree dans std::vector sont dans un tableau alloué (comme dans new [] ). Seules les informations de contrôle (le pointeur sur le tableau, la taille, etc.) sont stockées dans std::vector dans MoveTree .

2voto

junjanes Points 4858

Non, ce n'est pas portable. codepad.org ne le compile pas.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X