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 de passage par référence


Sujet :

Boost C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 199
    Points : 116
    Points
    116
    Par défaut Problème de passage par référence
    Bonjour à tous,

    J'ai un petit problème avec le passage par référence d'un shared_ptr.

    J'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Base;
    class Fille : public Base;
     
    void fonction1( boost::shared_ptr<Base>& ){}
     
    void fonction2( boost::shared_ptr<Fille>& fille )
    {
       fonction1(fille);
    }
    La compilation échoue car il dit ne pas pouvoir convertir un shared_ptr<Fille> en shared_ptr<Base>&. Je ne comprend pas trop pourquoi auriez-vous une idée?

    Merci d'avance

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Bonjour

    La raison est que même s'il existe une relation d'héritage entre 2 classes, les instanciations d'un template en utilisant ces classes comme argument n'ont pas de relation d'héritage entre eux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template<typename T> class A {};
    class B {};
    classe C : public B {};
     
    // C hérite de B
    // A<C> n'hérite pas de A<B>
    Mais pas d'inquiétude, dans le cas de shared_ptr, les outils sont fournis pour respecter les héritages (voir le tutoriel de Loïc Joly sur les smarts pointers : Compatibilité entre shared_ptr) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Base;
    class Fille : public Base;
     
    void fonction1( boost::shared_ptr<Base>& ){}
     
    void fonction2( boost::shared_ptr<Fille>& fille )
    {
       fonction1(dynamic_pointer_cast<Base>(fille));
    }
    Je te conseille la lecture du tutoriel en entier pour bien comprendre les smarts pointers

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 199
    Points : 116
    Points
    116
    Par défaut
    Avec cette solution ça compile mais j'ai le message suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    warning C4239: extension non standard utilisée*: 'argument'*: conversion de 'boost::shared_ptr<T>' en 'boost::shared_ptr<T> &'
    De plus la modification de l'objet dans fonction1 n'a pas d'impact sur l'objet initial...

Discussions similaires

  1. Problème passage par références
    Par trecks dans le forum C++
    Réponses: 3
    Dernier message: 10/10/2007, 20h50
  2. Problème avec vector par référence
    Par vdumont dans le forum SL & STL
    Réponses: 11
    Dernier message: 09/05/2006, 08h25
  3. Réponses: 4
    Dernier message: 26/12/2005, 17h01
  4. Passage par référence
    Par difficiledetrouver1pseudo dans le forum Langage
    Réponses: 9
    Dernier message: 28/09/2005, 11h17
  5. Problème très rapide de passage par référence
    Par Noxexplorer dans le forum ASP
    Réponses: 2
    Dernier message: 23/06/2005, 10h02

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