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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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