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 :

[smart_ptr] et [friend] erreur no known conversion for argument, cast de class dérivée


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Par défaut [smart_ptr] et [friend] erreur no known conversion for argument, cast de class dérivée
    Bonjour,

    Mon C++ est un peut rouillé alors je ne vois pas encore bien où peut être le problème sur cet exemple de code opensource, que j'essaye de compiler avec g++

    J'ai condensé le code dans un seul fichier pour répéter l'erreur que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    g++ -c -Wall -Wno-unknown-pragmas -Wno-format -O3 -std=gnu++11 -DTIXML_USE_STL -I ~/code/ruby/gosu/MonkSVG/thirdparty/boost_1_55_0/ test_smart_ptr.cpp -o test_smart_ptr.o
    test_smart_ptr.cpp: In function ‘int main(int, char* const*)’:
    test_smart_ptr.cpp:33:34: error: no matching function for call to ‘MonkSVG::SVG::initialize(SVGHandler*)’
      svg_parser.initialize( &handler );
                                      ^
    test_smart_ptr.cpp:33:34: note: candidate is:
    test_smart_ptr.cpp:20:8: note: bool MonkSVG::SVG::initialize(MonkSVG::ISVGHandler::SmartPtr)
       bool initialize( ISVGHandler::SmartPtr handler ) { return true; }
            ^
    test_smart_ptr.cpp:20:8: note:   no known conversion for argument 1 from ‘SVGHandler*’ to ‘MonkSVG::ISVGHandler::SmartPtr {aka boost::shared_ptr<MonkSVG::ISVGHandler>}
    le code source ici http://pastie.org/8809379#1

    Pour moi, étant donné que SVGHandler dérive de MonkSVG::ISVGHandler, il devrait être éligible comme un boost::shared_ptr<ISVGHandler> (ligne 10) ?

    après le code était prévu pour xcode sur mac et j'ai essayé de le compilé sous linux.
    Le code original, une fois remis en place avec les contraintes GNU/linux, donne le même genre d'erreur. Le code est un peu ancien, j'ai pris la dernière version de boost.

    J'ai essayé de remplacer les lignes 33 34 par…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	MonkSVG::ISVGHandler::SmartPtr handler(new SVGHandler);
    	svg_parser.initialize( handler );
    le compilateur aime encore moins…

    Si vous voyez un truc flagrant, je suis preneur.

    Cordialement,
    Sylvain.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Pour l'exemple que tu as mis, je n'aime pas plus ce que tu as écrit que le compilateur, et je suis bien content qu'il te le refuse :
    La construction d'un shared_ptr à partir d'un pointeur est explicite. Ce qui signifie que tu ne peut pas l'utiliser pour convertir à la volée un pointeur en shared_ptr. Et c'est une très bonne chose ici. Un shared_ptr a pour objectif de gérer la durée de vie de l'objet pointé, en le détruisant quand il n'y en a plus besoin. Il est propriétaire (avec propriété partagée) de cet objet. Or là, la durée de vie de handler est déjà gérée : C'est une variable locale qui sera détruite dès que l'on sortira du scope ! Tu vas donc faire un delete d'une variable gérée dans la pile, c'est une bonne chose que le compilateur te montre explicitement ce que tu allais faire !

    La seconde écriture m' l'air plus correcte (mais je ne suis pas encore totalement réveillé). Tu peux me donner l'erreur de ton compilateur ?

    Sachant que je ne trouve pas cette écriture très belle quand même :
    - Quand on veut créer un shared_ptr et l'objet pointé simultanément, il vaut mieux utiliser [std/boost]::make_shared (plus simple, plus exception safe, et plus performant).
    - J'ai des doutes sur l’intérêt de passer un shared_ptr en argument de initialize, plutôt qu'une simple référence. Mais il faudrait plus d'infos sur ce que cette fonction est sensée faire pour confirmer/infirmer ces doutes.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Par défaut
    Bonjour,

    Citation Envoyé par JolyLoic Voir le message
    Pour l'exemple que tu as mis, je n'aime pas plus ce que tu as écrit que le compilateur, et je suis bien content qu'il te le refuse :
    La construction d'un shared_ptr à partir d'un pointeur est explicite. Ce qui signifie que tu ne peut pas l'utiliser pour convertir à la volée un pointeur en shared_ptr.
    Je ne suis pas l'auteur du code, j'essaye juste de le faire fonctionner. Je ne sais pas même pas encore si l'utilisation des shared_ptr a un intérêt dans ce cas.


    Citation Envoyé par JolyLoic Voir le message
    La seconde écriture m' l'air plus correcte (mais je ne suis pas encore totalement réveillé). Tu peux me donner l'erreur de ton compilateur ?
    Je vais relire l'erreur, on dirait une erreur de linker seulement. C'est peut être bon finalement… J'ai pas le temps tout de suite mais je regarderai un peu plus tard.

    Citation Envoyé par JolyLoic Voir le message
    - J'ai des doutes sur l’intérêt de passer un shared_ptr en argument de initialize, plutôt qu'une simple référence. Mais il faudrait plus d'infos sur ce que cette fonction est sensée faire pour confirmer/infirmer ces doutes.
    Alors de ce que je comprends ce code qui est un parser simplifié de SVG, récupère un handler qui doit fournir une série de méthodes concrètes qui géreront, à la convenance du développeur, les informations extraites du SVG.

    Dans le pastie j'ai écourté le code. Mais si j'ai bien compris, le MonkSVG::ISVGHandler définit une interface ou une classe abstraite qui donne les protypes des types d'appels à implémenter pour le parser (class SVG). Je vois l'intérêt de cette forme de flexibilité, mais je ne peux pas encore juger de la pertinence de ce passage avec un smart_ptr…

    Note bien, que ce n'est pas ma question de la pertinence de ce code. Je vais m'adresser à l'auteur pour ça.

    Merci de tes remarques, ça confirme mes soupçons et m'aiguille sur une bonne réflexion.
    Sylvain.

  4. #4
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Par défaut
    http://pastie.org/8812830

    Voici le message du compilateur, c'est un warning :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /home/sylvain/code/ruby/gosu/MonkSVG/thirdparty/boost_1_55_0/boost/checked_delete.hpp:34:5:
    warning: deleting object of polymorphic class type ‘SVGHandler’ which has non-virtual destructor might cause undefined behaviour [-Wdelete-non-virtual-dtor]
    bref pas top tout ça…

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Il a encore une fois bien raison ton compilateur, tu devrait l'en remercier

    Ajoute ~ISVGHandler() {} dans la classe ISVGHandler. Voir : http://cpp.developpez.com/faq/cpp/?p...UCTEUR_virtuel
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Il a encore une fois bien raison ton compilateur, tu devrait l'en remercier
    Merci. C'est fait déjà. Mais il est timide et refuse les compliments…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    g++ --merci
    g++: error: unrecognized command line option ‘--merci’
    g++: fatal error: no input files
    compilation terminated.

Discussions similaires

  1. Shell - Erreur dans une boucle for
    Par claralavraie dans le forum Linux
    Réponses: 4
    Dernier message: 11/01/2006, 13h45
  2. Erreur avec la boucle For
    Par Harvester dans le forum Langage
    Réponses: 3
    Dernier message: 06/11/2005, 16h46
  3. Erreur lors de conversion de champ d'une table
    Par vitalogy dans le forum Access
    Réponses: 3
    Dernier message: 15/09/2005, 10h36
  4. [Eclipse / Jonas] Erreur "jonas-entity missing for bean"
    Par citygirl dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 16/05/2005, 11h59
  5. Réponses: 2
    Dernier message: 10/11/2004, 12h21

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