aide sur un problème ponctuel (std::list, templates)
3 réponses
meow
Bonjour, je solicite votre aide sur un petit soucis qui m'a tenu la
journ=E9e. Je suis en train de modifier une classe et mon appli ne veut
plus compiler.
J'utilise la biblioth=E8que CGAL qui fait un usqge intensif des
templates. Dedans il y a une classe Alpha_shapes_3D qui, pour aller
vite est un objet g=E9om=E9trique compos=E9 d'arretes, de facettes
(triangulaires), etc... Ce qui m'int=E9rresse c'est d'afficher une alpha
shape dans une fenetre openGl. J'ai ecrit une classe AlphaShapeDrawer
qui poss=E8de une fonction draw(alphashape const &) qui farfouille dans
l'alpha shape donn=E9e en param=E8tre et fait les appels openGls qui vont
bien. J'ai voulu passer =E0 un autre design pour que ce soit 'plus
joli' : non plus une classe qui sait dessiner des alpha shapes, mais
une classe qui aggr=E9ge une alpha shape et saurait la dessiner. Bref,
un alphashape * dans la classe AlphaShapeDrawable et une fonction
draw().
Cette deuxi=E8me impl=E9mentation ne plait pas =E0 mon compilo et je
n'arrive pas =E0 comprendre ses messages cryptiques. Je me permets de
poser =E7a dessous au cas o=F9 =E7a =E9voquerait quelque chose pour vous :
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Michael DOUBEZ
Bonjour, je solicite votre aide sur un petit soucis qui m'a tenu la journée. Je suis en train de modifier une classe et mon appli ne veut plus compiler. J'utilise la bibliothèque CGAL qui fait un usqge intensif des templates. Dedans il y a une classe Alpha_shapes_3D qui, pour aller vite est un objet géométrique composé d'arretes, de facettes (triangulaires), etc... Ce qui m'intérresse c'est d'afficher une alpha shape dans une fenetre openGl. J'ai ecrit une classe AlphaShapeDrawer qui possède une fonction draw(alphashape const &) qui farfouille dans l'alpha shape donnée en paramètre et fait les appels openGls qui vont bien. J'ai voulu passer à un autre design pour que ce soit 'plus joli' : non plus une classe qui sait dessiner des alpha shapes, mais une classe qui aggrége une alpha shape et saurait la dessiner. Bref, un alphashape * dans la classe AlphaShapeDrawable et une fonction draw().
Cette deuxième implémentation ne plait pas à mon compilo et je n'arrive pas à comprendre ses messages cryptiques. Je me permets de poser ça dessous au cas où ça évoquerait quelque chose pour vous :
et plus loin : std::list<Edges> edges; edges.clear(); A->get_alpha_shape_edges(std::back_inserter(edges), As::INTERIOR, alpha);
et un extrait de ses insultes (désolé pour la longueur, mais je n'arrive meme pas à extraire ce qui est pertinent) :
[snip]
/usr/local/CGAL-3.1/include/CGAL/Alpha_shape_3.h:816: error: no match for 'operator=' in 'it. std::back_insert_iterator<_Container>::operator ++ [with _Container > std::list< [...] >] (0).std::back_insert_iterator<_Container>::operator* [with _Container [snip] /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/ stl_iterator.h:362: note: candidates are: std::back_insert_iterator<_Container>& std::back_insert_iterator<_Container>::operator=(typename _Container::const_reference) [with _Container > std::list<CGAL::TDS_v3<CGAL::Alpha_shape_vertex_base_3<CGAL::Weighted_alpha_shape_euclidean_traits_3<CGAL::Filtered_kernel<CGAL::Simple_cartesian<double> [snip]
Il semble qu'il y a un problème d'opérateur d'affectation. Sans le code source, je peux pas en dire beaucoup plus.
Michael
Bonjour, je solicite votre aide sur un petit soucis qui m'a tenu la
journée. Je suis en train de modifier une classe et mon appli ne veut
plus compiler.
J'utilise la bibliothèque CGAL qui fait un usqge intensif des
templates. Dedans il y a une classe Alpha_shapes_3D qui, pour aller
vite est un objet géométrique composé d'arretes, de facettes
(triangulaires), etc... Ce qui m'intérresse c'est d'afficher une alpha
shape dans une fenetre openGl. J'ai ecrit une classe AlphaShapeDrawer
qui possède une fonction draw(alphashape const &) qui farfouille dans
l'alpha shape donnée en paramètre et fait les appels openGls qui vont
bien. J'ai voulu passer à un autre design pour que ce soit 'plus
joli' : non plus une classe qui sait dessiner des alpha shapes, mais
une classe qui aggrége une alpha shape et saurait la dessiner. Bref,
un alphashape * dans la classe AlphaShapeDrawable et une fonction
draw().
Cette deuxième implémentation ne plait pas à mon compilo et je
n'arrive pas à comprendre ses messages cryptiques. Je me permets de
poser ça dessous au cas où ça évoquerait quelque chose pour vous :
Bonjour, je solicite votre aide sur un petit soucis qui m'a tenu la journée. Je suis en train de modifier une classe et mon appli ne veut plus compiler. J'utilise la bibliothèque CGAL qui fait un usqge intensif des templates. Dedans il y a une classe Alpha_shapes_3D qui, pour aller vite est un objet géométrique composé d'arretes, de facettes (triangulaires), etc... Ce qui m'intérresse c'est d'afficher une alpha shape dans une fenetre openGl. J'ai ecrit une classe AlphaShapeDrawer qui possède une fonction draw(alphashape const &) qui farfouille dans l'alpha shape donnée en paramètre et fait les appels openGls qui vont bien. J'ai voulu passer à un autre design pour que ce soit 'plus joli' : non plus une classe qui sait dessiner des alpha shapes, mais une classe qui aggrége une alpha shape et saurait la dessiner. Bref, un alphashape * dans la classe AlphaShapeDrawable et une fonction draw().
Cette deuxième implémentation ne plait pas à mon compilo et je n'arrive pas à comprendre ses messages cryptiques. Je me permets de poser ça dessous au cas où ça évoquerait quelque chose pour vous :
et plus loin : std::list<Edges> edges; edges.clear(); A->get_alpha_shape_edges(std::back_inserter(edges), As::INTERIOR, alpha);
et un extrait de ses insultes (désolé pour la longueur, mais je n'arrive meme pas à extraire ce qui est pertinent) :
[snip]
/usr/local/CGAL-3.1/include/CGAL/Alpha_shape_3.h:816: error: no match for 'operator=' in 'it. std::back_insert_iterator<_Container>::operator ++ [with _Container > std::list< [...] >] (0).std::back_insert_iterator<_Container>::operator* [with _Container [snip] /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/ stl_iterator.h:362: note: candidates are: std::back_insert_iterator<_Container>& std::back_insert_iterator<_Container>::operator=(typename _Container::const_reference) [with _Container > std::list<CGAL::TDS_v3<CGAL::Alpha_shape_vertex_base_3<CGAL::Weighted_alpha_shape_euclidean_traits_3<CGAL::Filtered_kernel<CGAL::Simple_cartesian<double> [snip]
Il semble qu'il y a un problème d'opérateur d'affectation. Sans le code source, je peux pas en dire beaucoup plus.
Michael
James Kanze
meow wrote:
J'utilise la bibliothèque CGAL qui fait un usqge intensif des templates. Dedans il y a une classe Alpha_shapes_3D qui, pour aller vite est un objet géométrique composé d'arretes, de facettes (triangulaires), etc... Ce qui m'intérresse c'est d'afficher une alpha shape dans une fenetre openGl. J'ai ecrit une classe AlphaShapeDrawer qui possède une fonction draw(alphashape const &) qui farfouille dans l'alpha shape donnée en paramètre et fait les appels openGls qui vont bien. J'ai voulu passer à un autre design pour que ce soit 'plus joli' : non plus une classe qui sait dessiner des alpha shapes, mais une classe qui aggrége une alpha shape et saurait la dessiner. Bref, un alphashape * dans la classe AlphaShapeDrawable et une fonction draw().
Cette deuxième implémentation ne plait pas à mon compilo et je n'arrive pas à comprendre ses messages cryptiques. Je me permets de poser ça dessous au cas où ça évoquerait quelque chose pour vous :
et plus loin : std::list<Edges> edges; edges.clear(); A->get_alpha_shape_edges(std::back_inserter(edges), As::INTERIOR, alpha);
C'est difficile à dire quoique ce soit sans savoir ce que c'est A ni les définitions de get_alpha_shape_*. D'après les messages d'erreur, je conclus que ce sont des fonctions templatées, et que c'est l'instantiation (déclenchée par leur utilisation ci-dessus) qui ne va pas. Alors, ou bien, il y a une erreur dans la fonction même, ou bien, tu l'a instancié avec quelque chose qui ne lui va pas (qui n'est pas conforme aux contraints).
Pour commencer, je démanderais quels sont les contraints des paramètres de ces fonctions. Est-ce qu'elles acceptent un itérateur de sortie, par exemple, ou est-ce qu'elles ont besoins d'un « forward iterator », ou quelque chose de plus ?
et un extrait de ses insultes (désolé pour la longueur, mais je n'arrive meme pas à extraire ce qui est pertinent) :
En général, la première et la dernière ligne de chaque erreur sont les plus signifiante.
../../GL2/GLAlphaShape3Drawable.h:349: instantiated from 'void GLAlphashape3Drawable<As>::draw() [with As = CGAL::Alpha_shape_3<CGAL::RT3<CGAL::Weighted_alpha_shape_euclidean_traits _3<CGAL::Filtered_kernel<CGAL::Simple_cartesian<double>
Ce n'est qu'un avertissement : la fonction définie À Alpha_shape_3.h, ligne 788, a un paramètre qui s'appelle alpha, et qui ne sert pas. Supprime le nom du paramètre pour taire l'avertissement (ce qui laisse moins de messages à analyser).
[...]
/usr/local/CGAL-3.1/include/CGAL/Alpha_shape_3.h: In member function 'OutputIterator
, CGAL::TDS_cb3<void> > > > >]': ../../GL2/GLAlphaShape3Drawable.h:464: instantiated from 'void
GLAlphashape3Drawable<As>::draw() [with As = [...]
GL2_QGL_alphashapeViewer.h:32: instantiated from here /usr/local/CGAL-3.1/include/CGAL/Alpha_shape_3.h:816: error: no match for 'operator=' in 'it. std::back_insert_iterator<_Container>::operator ++ [with _Container = [...]
A priori, tu essaies d'affecter quelque chose à ton itérateur qui ne lui convient pas. Peut-être dans une expression du genre : *iter ++ = ... ; (Quelque part dans tout ce que j'ai supprimé, il y a eu mention des opérateurs * et ++.) Sache que les back_insert_iterator (et les itérateurs de sortie en général) ne sont pas réelement des itérateurs ; que les opérateurs ++ et * ne font rien que de renvoyer une référence à l'itérateur même, et que c'est une affectation d'une valeur à l'itérateur qui insère cette valeur dans la collection. Une expression comme celle-là a exactement le même effet que : iter = ... ;
Ça veut dire que quelque part dans get_alpha_shape_facets, tu essaies d'insérer un edge, et vice versa. Ou... est-ce que Facets et Edges ont une classe de base commune, et que c'est ça que tu finis par insérer ? (Attention s'il y a du polymorphisme. Les collections contiennent des valeurs, donc, des objets non polymorphique, d'un type bien précis. Pour avoir la polymorphisme, il faut passer par des pointeurs.)
-- James Kanze (GABI Software) email: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
meow wrote:
J'utilise la bibliothèque CGAL qui fait un usqge intensif des
templates. Dedans il y a une classe Alpha_shapes_3D qui, pour aller
vite est un objet géométrique composé d'arretes, de facettes
(triangulaires), etc... Ce qui m'intérresse c'est d'afficher une alpha
shape dans une fenetre openGl. J'ai ecrit une classe AlphaShapeDrawer
qui possède une fonction draw(alphashape const &) qui farfouille dans
l'alpha shape donnée en paramètre et fait les appels openGls qui vont
bien. J'ai voulu passer à un autre design pour que ce soit 'plus
joli' : non plus une classe qui sait dessiner des alpha shapes, mais
une classe qui aggrége une alpha shape et saurait la dessiner. Bref,
un alphashape * dans la classe AlphaShapeDrawable et une fonction
draw().
Cette deuxième implémentation ne plait pas à mon compilo et je
n'arrive pas à comprendre ses messages cryptiques. Je me permets de
poser ça dessous au cas où ça évoquerait quelque chose pour vous :
et plus loin :
std::list<Edges> edges;
edges.clear();
A->get_alpha_shape_edges(std::back_inserter(edges), As::INTERIOR,
alpha);
C'est difficile à dire quoique ce soit sans savoir ce que c'est
A ni les définitions de get_alpha_shape_*. D'après les messages
d'erreur, je conclus que ce sont des fonctions templatées, et
que c'est l'instantiation (déclenchée par leur utilisation
ci-dessus) qui ne va pas. Alors, ou bien, il y a une erreur dans
la fonction même, ou bien, tu l'a instancié avec quelque chose
qui ne lui va pas (qui n'est pas conforme aux contraints).
Pour commencer, je démanderais quels sont les contraints des
paramètres de ces fonctions. Est-ce qu'elles acceptent un
itérateur de sortie, par exemple, ou est-ce qu'elles ont besoins
d'un « forward iterator », ou quelque chose de plus ?
et un extrait de ses insultes (désolé pour la longueur, mais je
n'arrive meme pas à extraire ce qui est pertinent) :
En général, la première et la dernière ligne de chaque erreur
sont les plus signifiante.
../../GL2/GLAlphaShape3Drawable.h:349: instantiated from 'void
GLAlphashape3Drawable<As>::draw() [with As =
CGAL::Alpha_shape_3<CGAL::RT3<CGAL::Weighted_alpha_shape_euclidean_traits _3<CGAL::Filtered_kernel<CGAL::Simple_cartesian<double>
Ce n'est qu'un avertissement : la fonction définie À
Alpha_shape_3.h, ligne 788, a un paramètre qui s'appelle alpha,
et qui ne sert pas. Supprime le nom du paramètre pour taire
l'avertissement (ce qui laisse moins de messages à analyser).
[...]
/usr/local/CGAL-3.1/include/CGAL/Alpha_shape_3.h: In member function
'OutputIterator
, CGAL::TDS_cb3<void> > > > >]':
../../GL2/GLAlphaShape3Drawable.h:464: instantiated from 'void
GLAlphashape3Drawable<As>::draw() [with As =
[...]
GL2_QGL_alphashapeViewer.h:32: instantiated from here
/usr/local/CGAL-3.1/include/CGAL/Alpha_shape_3.h:816: error: no match
for 'operator=' in 'it. std::back_insert_iterator<_Container>::operator
++ [with _Container =
[...]
A priori, tu essaies d'affecter quelque chose à ton itérateur
qui ne lui convient pas. Peut-être dans une expression du
genre :
*iter ++ = ... ;
(Quelque part dans tout ce que j'ai supprimé, il y a eu mention
des opérateurs * et ++.) Sache que les back_insert_iterator (et
les itérateurs de sortie en général) ne sont pas réelement des
itérateurs ; que les opérateurs ++ et * ne font rien que de
renvoyer une référence à l'itérateur même, et que c'est une
affectation d'une valeur à l'itérateur qui insère cette valeur
dans la collection. Une expression comme celle-là a exactement
le même effet que :
iter = ... ;
Ça veut dire que quelque part dans get_alpha_shape_facets, tu
essaies d'insérer un edge, et vice versa. Ou... est-ce que
Facets et Edges ont une classe de base commune, et que c'est ça
que tu finis par insérer ? (Attention s'il y a du
polymorphisme. Les collections contiennent des valeurs, donc,
des objets non polymorphique, d'un type bien précis. Pour avoir
la polymorphisme, il faut passer par des pointeurs.)
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
J'utilise la bibliothèque CGAL qui fait un usqge intensif des templates. Dedans il y a une classe Alpha_shapes_3D qui, pour aller vite est un objet géométrique composé d'arretes, de facettes (triangulaires), etc... Ce qui m'intérresse c'est d'afficher une alpha shape dans une fenetre openGl. J'ai ecrit une classe AlphaShapeDrawer qui possède une fonction draw(alphashape const &) qui farfouille dans l'alpha shape donnée en paramètre et fait les appels openGls qui vont bien. J'ai voulu passer à un autre design pour que ce soit 'plus joli' : non plus une classe qui sait dessiner des alpha shapes, mais une classe qui aggrége une alpha shape et saurait la dessiner. Bref, un alphashape * dans la classe AlphaShapeDrawable et une fonction draw().
Cette deuxième implémentation ne plait pas à mon compilo et je n'arrive pas à comprendre ses messages cryptiques. Je me permets de poser ça dessous au cas où ça évoquerait quelque chose pour vous :
et plus loin : std::list<Edges> edges; edges.clear(); A->get_alpha_shape_edges(std::back_inserter(edges), As::INTERIOR, alpha);
C'est difficile à dire quoique ce soit sans savoir ce que c'est A ni les définitions de get_alpha_shape_*. D'après les messages d'erreur, je conclus que ce sont des fonctions templatées, et que c'est l'instantiation (déclenchée par leur utilisation ci-dessus) qui ne va pas. Alors, ou bien, il y a une erreur dans la fonction même, ou bien, tu l'a instancié avec quelque chose qui ne lui va pas (qui n'est pas conforme aux contraints).
Pour commencer, je démanderais quels sont les contraints des paramètres de ces fonctions. Est-ce qu'elles acceptent un itérateur de sortie, par exemple, ou est-ce qu'elles ont besoins d'un « forward iterator », ou quelque chose de plus ?
et un extrait de ses insultes (désolé pour la longueur, mais je n'arrive meme pas à extraire ce qui est pertinent) :
En général, la première et la dernière ligne de chaque erreur sont les plus signifiante.
../../GL2/GLAlphaShape3Drawable.h:349: instantiated from 'void GLAlphashape3Drawable<As>::draw() [with As = CGAL::Alpha_shape_3<CGAL::RT3<CGAL::Weighted_alpha_shape_euclidean_traits _3<CGAL::Filtered_kernel<CGAL::Simple_cartesian<double>
Ce n'est qu'un avertissement : la fonction définie À Alpha_shape_3.h, ligne 788, a un paramètre qui s'appelle alpha, et qui ne sert pas. Supprime le nom du paramètre pour taire l'avertissement (ce qui laisse moins de messages à analyser).
[...]
/usr/local/CGAL-3.1/include/CGAL/Alpha_shape_3.h: In member function 'OutputIterator
, CGAL::TDS_cb3<void> > > > >]': ../../GL2/GLAlphaShape3Drawable.h:464: instantiated from 'void
GLAlphashape3Drawable<As>::draw() [with As = [...]
GL2_QGL_alphashapeViewer.h:32: instantiated from here /usr/local/CGAL-3.1/include/CGAL/Alpha_shape_3.h:816: error: no match for 'operator=' in 'it. std::back_insert_iterator<_Container>::operator ++ [with _Container = [...]
A priori, tu essaies d'affecter quelque chose à ton itérateur qui ne lui convient pas. Peut-être dans une expression du genre : *iter ++ = ... ; (Quelque part dans tout ce que j'ai supprimé, il y a eu mention des opérateurs * et ++.) Sache que les back_insert_iterator (et les itérateurs de sortie en général) ne sont pas réelement des itérateurs ; que les opérateurs ++ et * ne font rien que de renvoyer une référence à l'itérateur même, et que c'est une affectation d'une valeur à l'itérateur qui insère cette valeur dans la collection. Une expression comme celle-là a exactement le même effet que : iter = ... ;
Ça veut dire que quelque part dans get_alpha_shape_facets, tu essaies d'insérer un edge, et vice versa. Ou... est-ce que Facets et Edges ont une classe de base commune, et que c'est ça que tu finis par insérer ? (Attention s'il y a du polymorphisme. Les collections contiennent des valeurs, donc, des objets non polymorphique, d'un type bien précis. Pour avoir la polymorphisme, il faut passer par des pointeurs.)
-- James Kanze (GABI Software) email: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
meow
En fait c'est couillon, mais je me rends compte que je ne sais pas exactement comment lire les messages du compilo lorsqu'ils tiennent sur plusieurs lignes. A l'instinct je dirais que ça ressemble à :
nom de fichier, lignes, "instancié à :" ... nom de fichier, lignes, "instancié à :" description de l'erreur ou du warning
Du coups je comprends mieux l'idée... Ici, la première partie est dévolue au warning sur alpha (qui n'est pas bien grave et qui plus est se trouve dans CGAL... Cela dit, y a t'il un moyen de spécifier au compilo que "oui, je sais qu'à cet endroit précis il y a un alpha dont je ne me sers pas et que je m'en fiche" ?). Du coups je reportes mon attention sur la seconde partie et que vois-je ? : A priori l'erreur est dans un fichier moc_blahblah.cpp ...Argh, une couche d'entropie supplémentaire. En fait j'ai menti : j'ai fait une autre modif dans ce code que le simple déplacement de mon alphashape : j'ai ajouté du qt... Je n'ai malheureusement plus le temps de me pencher sur la question maintenant mais j'y reviendrai plus tard.
Merci à vous pour les conseils et votre patience à fourrager dans mon log immangeable.
En fait c'est couillon, mais je me rends compte que je ne sais pas
exactement comment lire les messages du compilo lorsqu'ils tiennent
sur plusieurs lignes. A l'instinct je dirais que ça ressemble à :
nom de fichier, lignes, "instancié à :"
...
nom de fichier, lignes, "instancié à :"
description de l'erreur ou du warning
Du coups je comprends mieux l'idée... Ici, la première partie est
dévolue au warning sur alpha (qui n'est pas bien grave et qui plus est
se trouve dans CGAL... Cela dit, y a t'il un moyen de spécifier au
compilo que "oui, je sais qu'à cet endroit précis il y a un alpha dont
je ne me sers pas et que je m'en fiche" ?). Du coups je reportes mon
attention sur la seconde partie et que vois-je ? : A priori l'erreur
est dans un fichier moc_blahblah.cpp ...Argh, une couche d'entropie
supplémentaire.
En fait j'ai menti : j'ai fait une autre modif dans ce code que le
simple déplacement de mon alphashape : j'ai ajouté du qt... Je n'ai
malheureusement plus le temps de me pencher sur la question maintenant
mais j'y reviendrai plus tard.
Merci à vous pour les conseils et votre patience à fourrager dans mon
log immangeable.
En fait c'est couillon, mais je me rends compte que je ne sais pas exactement comment lire les messages du compilo lorsqu'ils tiennent sur plusieurs lignes. A l'instinct je dirais que ça ressemble à :
nom de fichier, lignes, "instancié à :" ... nom de fichier, lignes, "instancié à :" description de l'erreur ou du warning
Du coups je comprends mieux l'idée... Ici, la première partie est dévolue au warning sur alpha (qui n'est pas bien grave et qui plus est se trouve dans CGAL... Cela dit, y a t'il un moyen de spécifier au compilo que "oui, je sais qu'à cet endroit précis il y a un alpha dont je ne me sers pas et que je m'en fiche" ?). Du coups je reportes mon attention sur la seconde partie et que vois-je ? : A priori l'erreur est dans un fichier moc_blahblah.cpp ...Argh, une couche d'entropie supplémentaire. En fait j'ai menti : j'ai fait une autre modif dans ce code que le simple déplacement de mon alphashape : j'ai ajouté du qt... Je n'ai malheureusement plus le temps de me pencher sur la question maintenant mais j'y reviendrai plus tard.
Merci à vous pour les conseils et votre patience à fourrager dans mon log immangeable.