Bonjour à tous,
Je viens demander de l'aide car j'ai un problème et je sèche un peu, j'ai fait des recherches et je n'ai rien trouvé.
En fait j'utilise la librairie de graphes dans boost, que je trouve vraiment excellente et qui convient parfaitement à ce que je souhaite faire.
A partir de la classe template boost::adjacency_list, je souhaite faire un typedef correspondant à un graphe dirigé où les sommets sont de type "node" et les arcs de type "extension".
Voici le code correspondant à ces deux types :
Maintenant, si je défini mon graphe dirigé de la manière suivante, tout compile bien :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 /** * Possible extensions */ enum class extension{i_extension, s_extension}; template<typename Item> struct node { Item item_; int support_; /** * Default, copy and members init constructors */ node() : item_{}, support_(-1) {} node(const node<Item>& other) : item_(other.item_), support_(other.support_) {} node(const Item& item, int support) : item_(item), support_(support) {} };
Cependant, mon graphe dirigé est en fait un arbre. Je souhaite donc mettre, en tant que propriété du graphe, son nœud racine. C'est là que les choses se compliquent, puisque je dois mettre le type de sommet comme propriété du graphe dans sa définition, sachant que le type de sommet a lui même besoin de la définition du graphe. J'avais déjà eu ce type de problème dans des cas plus simples que j'avais facilement résolu en déclarant par exemple un "struct vertex;" ou bien "class vertex;", etc. pour le définir plus loin. Mais là ça veut pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 template<typename Item> struct pattern_graph { // directed graph alias typedef boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS, // collections for vertices and edges, with both out-edge and in-edge access node<Item>, // vertex property --> the current pattern informations extension_flag, // edge property --> the extension type boost::no_property // graph property --> no property > type; };
Je vous donne le code qui pose problème :
Dans le code exemple j'ai mis "struct vertex;" mais essayé avec un peu tout ce que je pouvais. En fait le compilateur me dit qu'il a besoin de la définition complète du sommet pour définir le graphe et inversement. Pour l'instant j'ai trouvé une parade en définissant mon graphe sans nœud racine comme propriété du graphe et conservant la racine de manière externe. Mais ça me plait moyen.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 template<typename Item> struct pattern_tree { struct vertex; // <- Problème ici, comment déclarer // Tree alias typedef boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS, // collections for vertices and edges, with both out-edge and in-edge access node<Item>, // vertex property --> the current pattern informations extension, // edge property --> the extension type vertex // graph property --> root of the tree > type; // Vertex descriptor alias typedef typename boost::graph_traits<type>::vertex_descriptor vertex; };
Au final je me demande si ce que je veux faire est vraiment faisable sans passer par quelque chose d'un peu plus "tordu".
J'en appelle donc à votre aide
Merci,
Bonne soirée (et bonne année aussi !)
Partager