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

C++ Discussion :

conversion to non-scalar type requested !


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut conversion to non-scalar type requested !
    Hello,

    Je suis nouveau dans C++ je tente de récupérer un objet (il s'agit d'un itérateur) de l'objet courant (this) dans une méthode membre et j'obtiens cette erreur : conversion to non-scalar type requested.

    La méthode membre en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     void AC_Nef_Polyhedron::draw() const
     {
         // cela ne marche pas ("conversion to non-scalar type requested")
         Facet_iterator monIterator=facets_begin();
     
         // cela fonctionne
         AC_Nef_Polyhedron np (NULL,NULL);
         Facet_iterator t=np.facets_begin();
     
         // cela fonctionne
         AC_Nef_Polyhedron* hj=new AC_Nef_Polyhedron(NULL,NULL);
         Facet_iterator o=hj->facets_begin();
     }
    Qu'est-ce que je fais faux?

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    Il faudrait que tu nous montres la définition de Facet_iterator et facets_begin()

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut ...
    Ouiais, il s'agit d'une déclaration d'une bibliothèque tierce énorme ! (CGAL)...

    -> Le diagnostic (avec notamment mes exemples "qui marche") n'est-il pas faisable ?

    ?

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Il faudrait que tu donnes un peu plus de détails. Quelle ligne produit l'erreur? Quel est le code et le message d'erreur? Plateforme? Compilateur?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut ...
    Hello,

    La plate-forme est ubuntu, le compilateur est gcc.

    L'erreur se produit là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    Facet_iterator monIterator=facets_begin();
    ...
    Le message "complet" de l'erreur est ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     erreur: conversion from «CGAL::CGALi::In_place_list_const_iterator<CGAL::HalfedgeDS_in_place_list_face<CGAL::I_Polyhedron_facet<CGAL::HalfedgeDS_face_base<CGAL::HalfedgeDS_list_types<CGAL::Simple_cartesian<double>, CGAL::I_Polyhedron_derived_items_3<CGAL::Polyhedron_items_3>, std::allocator<int> >, CGAL::Boolean_tag<true>, CGAL::Plane_3<CGAL::Simple_cartesian<double> > > > >, std::allocator<CGAL::HalfedgeDS_in_place_list_face<CGAL::I_Polyhedron_facet<CGAL::HalfedgeDS_face_base<CGAL::HalfedgeDS_list_types<CGAL::Simple_cartesian<double>, CGAL::I_Polyhedron_derived_items_3<CGAL::Polyhedron_items_3>, std::allocator<int> >, CGAL::Boolean_tag<true>, CGAL::Plane_3<CGAL::Simple_cartesian<double> > > > > > >» to non-scalar type «CGAL::CGALi::In_place_list_iterator<CGAL::HalfedgeDS_in_place_list_face<CGAL::I_Polyhedron_facet<CGAL::HalfedgeDS_face_base<CGAL::HalfedgeDS_list_types<CGAL::Simple_cartesian<double>, CGAL::I_Polyhedron_derived_items_3<CGAL::Polyhedron_items_3>, std::allocator<int> >, CGAL::Boolean_tag<true>, CGAL::Plane_3<CGAL::Simple_cartesian<double> > > > >, std::allocator<CGAL::HalfedgeDS_in_place_list_face<CGAL::I_Polyhedron_facet<CGAL::HalfedgeDS_face_base<CGAL::HalfedgeDS_list_types<CGAL::Simple_cartesian<double>, CGAL::I_Polyhedron_derived_items_3<CGAL::Polyhedron_items_3>, std::allocator<int> >, CGAL::Boolean_tag<true>, CGAL::Plane_3<CGAL::Simple_cartesian<double> > > > > > >» requested

  6. #6
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Je pense avoir trouvé une piste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    erreur: conversion from «
     
    CGAL::CGALi::In_place_list_const_iterator<CGAL::HalfedgeDS_in_place_list_face<CGAL::I_Polyhedron_facet<CGAL::HalfedgeDS_face_base<CGAL::HalfedgeDS_list_types<CGAL::Simple_cartesian<double>, CGAL::I_Polyhedron_derived_items_3<CGAL::Polyhedron_items_3>, std::allocator<int> >, CGAL::Boolean_tag<true>, CGAL::Plane_3<CGAL::Simple_cartesian<double> > > > >, std::allocator<CGAL::HalfedgeDS_in_place_list_face<CGAL::I_Polyhedron_facet<CGAL::HalfedgeDS_face_base<CGAL::HalfedgeDS_list_types<CGAL::Simple_cartesian<double>, CGAL::I_Polyhedron_derived_items_3<CGAL::Polyhedron_items_3>, std::allocator<int> >, CGAL::Boolean_tag<true>, CGAL::Plane_3<CGAL::Simple_cartesian<double> > > > > > >» 
     
     
    to non-scalar type 
     
     
    CGAL::CGALi::In_place_list_iterator<CGAL::HalfedgeDS_in_place_list_face<CGAL::I_Polyhedron_facet<CGAL::HalfedgeDS_face_base<CGAL::HalfedgeDS_list_types<CGAL::Simple_cartesian<double>, CGAL::I_Polyhedron_derived_items_3<CGAL::Polyhedron_items_3>, std::allocator<int> >, CGAL::Boolean_tag<true>, CGAL::Plane_3<CGAL::Simple_cartesian<double> > > > >, std::allocator<CGAL::HalfedgeDS_in_place_list_face<CGAL::I_Polyhedron_facet<CGAL::HalfedgeDS_face_base<CGAL::HalfedgeDS_list_types<CGAL::Simple_cartesian<double>, CGAL::I_Polyhedron_derived_items_3<CGAL::Polyhedron_items_3>, std::allocator<int> >, CGAL::Boolean_tag<true>, CGAL::Plane_3<CGAL::Simple_cartesian<double> > > > > > >» requested
    La seule différence c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CGAL::CGALi::In_place_list_const_iterator
    CGAL::CGALi::In_place_list_iterator
    Et dans ton premier post, ta méthode AC_Nef_Polyhedron::draw() était const. Donc il faut peut être que tu fasses quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Facet_const_iterator monIterator = facets_begin();

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut ...
    Je vais m'empresser d'essayer !!!

    Merci !

    Te donnes des nouvelles !

    Gilles

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut ...tu chiales !!!
    ...ca marche !!!

    Je n'ai même pas vérifier dans la doc, mais un iterateur const existe !!

    -> Donc une méthode membre déclarée const ne peut pas 'employé' une autre entité non-const ou quelque chose comme ça ??

    -> J'ai lu quelques part qu'il était bon de déclarer const les méthodes membres qui ne sont pas sensées modifier l'objet ! Dans ce cas-là, j'ai perdu quelques heures !!!


    -> Merci mille fois !

    Gilles

  9. #9
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    En fait, ça explique très bien le comportement que tu as observé dans le post #1.

    Quand une fonction membre est const, cela veut dire qu'à l'intérieur de cette fonction tu ne peux pas modifier l'instance courante, ce qui implique de ne pouvoir appeler que les fonctions membres const de l'instance courante ou les fonctions membres const des objets membres de l'instance courante .

    Or la fonction begin() est probablement surchargée comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    iterator begin()
    {
    return ...;
    }
     
    const_iterator begin() const
    {
    return ...;
    }
    Et renvoi donc un iterator ou un const_iterator en fonction de la constness de la fonction.

    Donc en gros :
    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
     
     
    void AC_Nef_Polyhedron::draw() const
     {
     
    // erreur, conversion de Facet_const_iterator vers Facet_iterator impossible
       Facet_iterator monIterator=facets_begin();
     
    // Sauf qu'ici on déclare une NOUVELLE instance de AC_Nef_Polyhedron
    // elle n'est pas affecté epar le const de la fonction
    // qui ne s'applique qu'à l'instance en cours et à ses membres
       AC_Nef_Polyhedron np (NULL,NULL);
       Facet_iterator t = np.facets_begin(); // Ok
     
       // par contre on retomberait sur la même erreur en faisant...
        const  AC_Nef_Polyhedron np (NULL,NULL);
        Facet_iterator t = np.facets_begin();
    }
    J'ai lu quelques part qu'il était bon de déclarer const les méthodes membres qui ne sont pas sensées modifier l'objet ! Dans ce cas-là, j'ai perdu quelques heures !!!
    Ça reste un très bon conseil. Les avantages du respect de la constness dépasse largement les inconvénients. Même si c'est vrai que les messages d'erreur du au const sont souvent un peu étranges. On s'y fait.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Request member non-class type… C++
    Par sarahjayneburrell11 dans le forum Langage
    Réponses: 7
    Dernier message: 23/12/2011, 19h47
  2. Réponses: 29
    Dernier message: 23/08/2010, 09h24
  3. erreur conversion from to non scalar requested
    Par annesophiedecar dans le forum Langage
    Réponses: 2
    Dernier message: 15/10/2009, 23h16
  4. conversion to non-scalar type requested
    Par jbarreau-mainson dans le forum C
    Réponses: 15
    Dernier message: 03/04/2009, 12h58
  5. Conversion de chaîne "" en type Double non valide
    Par vérokit dans le forum VB.NET
    Réponses: 2
    Dernier message: 10/04/2008, 08h14

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