IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

Problème avec la BGL


Sujet :

Boost C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut Problème avec la BGL
    Bonjour à tous,
    dans le cadre de mon stage, je me suis recemment mis à fond au C++.
    Ayant besoin de travailler sur des graphes, j'ai naturellement décidé de
    me tourner vers la celebre bibliothèque BGL. Malheuresement, je rencontre
    un problème : en essayant de surcharger les fonctions de la BGL pour ma propre classe
    graphe (qui est en réalité une heightmap), il y a un appel que le compilo n'arrive pas
    à résoudre :

    Voici la fonction qui pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template < typename UcharMap >
    std::pair< typename graph_traits< Heightmap< UcharMap > >::adjacency_iterator, typename graph_traits< Heightmap< UcharMap > >::adjacency_iterator >
    adjacent_vertices(typename graph_traits< Heightmap< UcharMap > >::vertex_descriptor vertex, const Heightmap< UcharMap >& hm) {
        return std::make_pair(HeightmapGraphAdjacencyIterator< UcharMap >(&hm, vertex, hm.getAdjacencyMask(vertex), hm.getFirstNeighbour(vertex)),
                              HeightmapGraphAdjacencyIterator< UcharMap >(&hm, vertex, 0, 8));
      }
    Et c'est sur les deux appels aux constructeur de HeightmapGraphAdjacencyIterator que le compilateur bloque, voici son message :

    ./inc/Heightmap.hpp:413: error: no matching function for call to ‘boost::HeightmapGraphAdjacencyIterator<Map1D<unsigned char> >::HeightmapGraphAdjacencyIterator(const Heightmap<Map1D<unsigned char> >*, int, int, int)’
    ./inc/Heightmap.hpp:499: note: candidates are: boost::HeightmapGraphAdjacencyIterator<UcharMap>::HeightmapGraphAdjacencyIterator() [with UcharMap = Map1D<unsigned char>]
    ./inc/Heightmap.hpp:492: note: boost::HeightmapGraphAdjacencyIterator<UcharMap>::HeightmapGraphAdjacencyIterator(Heightmap<UcharMap>*, typename boost::graph_traits<Heightmap<UcharMap> >::vertex_descriptor, int, int) [with UcharMap = Map1D<unsigned char>] <near match>
    ./inc/Heightmap.hpp:481: note: boost::HeightmapGraphAdjacencyIterator<Map1D<unsigned char> >::HeightmapGraphAdjacencyIterator(const boost::HeightmapGraphAdjacencyIterator<Map1D<unsigned char> >&)

    Comme on peut le voir, il ne trouve pas le bon constructeur à appeler, or le type vertex_descriptor de ma classe graphe est un int dans la structure graph_traits associée >.< d'ailleur la variable vertex est bien typé vertex_descriptor dans la fonction adjacent_vertices.

    Voici le debut de la classe HeightmapGraphAdjacencyIterator qui montre le constructeur qui devrait être appelé et la déclaration d'amitié de la fonction adjacent_vertices :

    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 UcharMap >
      class HeightmapGraphAdjacencyIterator {
        typedef typename graph_traits< Heightmap< UcharMap > >::vertex_descriptor Vertex;
        const Heightmap< UcharMap >* map;
     
        Vertex vertex;
        int neighboursMask; // The ith bit of neighboursMask is 1 if vertex + map.adjacencyOffset(index) is a neighbour of vertex 
        int index; // vary from 0 to 7
     
        friend std::pair< typename graph_traits< Heightmap< UcharMap > >::adjacency_iterator, typename graph_traits< Heightmap< UcharMap > >::adjacency_iterator >
        adjacent_vertices<>(typename graph_traits< Heightmap< UcharMap > >::vertex_descriptor vertex, const Heightmap< UcharMap >& hm);
     
        HeightmapGraphAdjacencyIterator(Heightmap< UcharMap >* map, Vertex v, int mask, int index) : map(map), vertex(v), neighboursMask(mask), index(index) {
        }
    [...]
    Voici également le début de la structure graph_traits, ou l'on doit la définition du type vertex_descriptor :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template < typename UcharMap >
      struct graph_traits< Heightmap< UcharMap > > {
        typedef int vertex_descriptor;
        [...]
    Voila, je bloque la dessus =/ J'espere que quelqun arrivera à résoudre mon problème.
    Merci d'avance !

  2. #2
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    d'apres ton erreur, il a l'air d'interpréter ton vertex descriptor en int puis il ne semble plus pouvoir le réinterpréter en vertex_descriptor....

    a-tu essayé de le caster en boost::graph_traits<Heightmap<UcharMap> >::vertex_descriptor par hazard ?

    en effet, si on regarde ton message d'erreur, il y a écrit:
    Citation Envoyé par compilo
    [...]
    boost::HeightmapGraphAdjacencyIterator<UcharMap>::HeightmapGraphAdjacencyIterator(Heightmap<UcharMap>*, typename boost::graph_traits<Heightmap<UcharMap> >::vertex_descriptor, int, int) [with UcharMap = Map1D<unsigned char>] <near match>
    [...]
    ce qui veut à mon avis dire qu'il interprete le vertex_descriptor comme un type à part entière... peut-être à cause du fait que la fonction est définie avec typename....


    enfin, rien de bien précis, mais il me semble qu'un static_cast devrait lui suffire (ou alors, il y a un truc que j'ai pas vu).

    Bonne chance

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut
    Merci pour ta réponse, j'essayerais le static_cast =)

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Je n'ai pas tout lu ton code, mais l'avertissement me dit que tu as un problème de constance :
    no matching function for call to :
    ‘boost::HeightmapGraphAdjacencyIterator<Map1D<unsigned char> >::HeightmapGraphAdjacencyIterator(const Heightmap<Map1D<unsigned char> >*, int, int, int)’

    ./inc/Heightmap.hpp:499: note: candidates are: boost::HeightmapGraphAdjacencyIterator<UcharMap>::HeightmapGraphAdjacencyIterator(Heightmap<UcharMap>*, typename boost::graph_traits<Heightmap<UcharMap> >::vertex_descriptor, int, int) [with UcharMap = Map1D<unsigned char>] <near match>
    --> le premier arg n'est pas const !!
    Donc à priori, pas besoin de sortir l'artillerie []_cast tout de suite. Juste commencer par vérifier que les fonctions utilisent le bon niveau de constance

    Quant au typename, il est nécessaire : A quoi sert le mot-clé typename ?.

  5. #5
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Je n'ai pas tout lu ton code, mais l'avertissement me dit que tu as un problème de constance :

    Donc à priori, pas besoin de sortir l'artillerie []_cast tout de suite. Juste commencer par vérifier que les fonctions utilisent le bon niveau de constance
    désolé, je n'avais pas réussi à le voir.

    il effectivement déclaré tel quel dans la fonction:
    Citation Envoyé par Otium Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    adjacent_vertices(typename graph_traits< Heightmap< UcharMap > >::vertex_descriptor vertex, 
      const Heightmap< UcharMap >& hm)
    Citation Envoyé par 3DArchi Voir le message
    Quant au typename, il est nécessaire : A quoi sert le mot-clé typename ?.
    Je n'en doute pas. J'ai souvent été amené à l'utiliser. Simplement, je sais qu'un code qui marchait parfaitement sous gcc me faisait des difficultés sous visual par-ce que j'avais ajouté des typename. Je ne connais pas vraiment comment focntionnent les compilos, mais j'avais résoulu ça comme ça (mais je sais, les casts c'est mal .).

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    Je n'en doute pas. J'ai souvent été amené à l'utiliser. Simplement, je sais qu'un code qui marchait parfaitement sous gcc me faisait des difficultés sous visual par-ce que j'avais ajouté des typename.
    J'avais souvenir du contraire : visual acceptant des écriture où typename est nécessaire et gcc les refusant. Mais peut être que cela dépend aussi des options de compilation.
    Le mieux est quand même de trouver le vrai problème si on a le temps

  7. #7
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Et moi j'avais souvenir d'autres chose... visual très laxiste sur template / typename (si t'en omet il s'en sort quand même), mais je savais pas que le mettre (donc respecter la norme....) pouvait le faire râler.

  8. #8
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    Simplement, je sais qu'un code qui marchait parfaitement sous gcc me faisait des difficultés sous visual par-ce que j'avais ajouté des typename. Je ne connais pas vraiment comment focntionnent les compilos, mais j'avais résolu ça comme ça (mais je sais, les casts c'est mal .).
    Citation Envoyé par 3DArchi Voir le message
    J'avais souvenir du contraire : visual acceptant des écriture où typename est nécessaire et gcc les refusant. Mais peut être que cela dépend aussi des options de compilation.
    Le mieux est quand même de trouver le vrai problème si on a le temps
    C'est bien ce que je dis: en passant sous gcc, je devais ajouter des typename pour compiler, mais sous visual, non seullement ils n'étaient pas nécéssaire, mais il avait tendence à ne plus comprendre lorsque qu'ils étaient là

    Citation Envoyé par Goten Voir le message
    Et moi j'avais souvenir d'autres chose... visual très laxiste sur template / typename (si t'en omet il s'en sort quand même), mais je savais pas que le mettre (donc respecter la norme....) pouvait le faire râler.
    exactement pareil

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    je me suis mal fait comprendre. Mon souvenir est bien que Visual accepte des expressions sans typename alors que celui-ci est nécessaire; et gcc, lui, génère une erreur.
    En revanche, je suis surpris que des expressions nécessitant typename et pour lesquelles tu le mets échouent à compiler avec Visual. T'as un exemple facile à reproduire ?

  10. #10
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    je me suis mal fait comprendre. Mon souvenir est bien que Visual accepte des expressions sans typename alors que celui-ci est nécessaire; et gcc, lui, génère une erreur.
    oui oui nous sommes d'accord. par conséquent, sous gcc, il faut bien ajouter des typename par rapport a visual... ou en enlever sous visual par rapport à gcc.
    Citation Envoyé par 3DArchi Voir le message
    En revanche, je suis surpris que des expressions nécessitant typename et pour lesquelles tu le mets échouent à compiler avec Visual. T'as un exemple facile à reproduire ?
    Non, pas vraiment :s La plupart du temps ça passait, et puis une fois, il m'a sorti une des ces erreurs de 50 lignes de type récursif template alors que ça compilait nickel sous gcc. J'avais l'impression que ça venait du typename, puisqu'en comparant avec la version précédente, c'était la seule chose que j'avais changé... mais comme y'en avait beaucoup, j'ai préféré revenir à la version précédente.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut
    Merci pour toutes les réponses, et effectivement, le problème venait bien de la constance
    de l'argument >< (en plus c'est pas la première fois que je me le tape celui la, je devrait être habitué). Je vous laisse continuer le débat sur les compilos, de toute façon je n'utilise que gcc, ça simplifie les choses :o Merci encore !

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo