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 :

Problème de cast d'un objet de class dérivant d'un template


Sujet :

C++

  1. #1
    Futur Membre du Club Avatar de Tigole
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2
    Points : 6
    Points
    6
    Par défaut Problème de cast d'un objet de class dérivant d'un template
    Bonjour à tous !

    Avec l'architecture suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class SousClasse
    {};
    class SousClasseDerivee1 : public SousClasse
    {};
    class SousClasseDerivee2 : public SousClasse
    {};
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Interface
    {};
    template<typename T>
    class Abstraction : public Interface
    {};
     
    class Derivee1 : public Abstraction<SousClasseDerivee1>
    {};
    class Derivee2 : public Abstraction<SousClasseDerivee2>
    {
    void someStuff(Derivee1& d);
    };
    Je rencontre le problème suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Derivee2::someStuff(Derivee1& d)
    {
    Interface* brol(this); // <- Pas de problème
    Interface* trol(&d); // <- Refuse de compiler
    }
    En compilant sous Linux avec g++ 4.8.4, j'obtiens l'erreur suivante :
    error: cannot convert 'Derivee1*' to 'Interface*' in initialization

    Ok, Derivee1 et Derivee2 n'héritent pas directement de la même classe.
    Mais si on remonte jusqu'en haut, les 2 héritent pourtant de Interface -> Pourquoi cette erreur ? (sans compter que g++ arrive à déterminer que Derivee2 est-un Interface)

    Si c'est quelque chose qui est interdit par le C++, avez-vous des idées d'architecture permettant de palier ce problème ?

    Merci d'avance

  2. #2
    Futur Membre du Club Avatar de Tigole
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2
    Points : 6
    Points
    6
    Par défaut
    J'ai corrigé mon bug !!

    Le problème était que je n'avais pas inclue les fichiers dans lesquels étaient déclarés les différents types

    J'espère que ce poste pourra tout de même aider des personnes ayant des problèmes similaires

  3. #3
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 109
    Points
    6 109
    Par défaut
    Bonjour,

    Citation Envoyé par Tigole Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Derivee2::someStuff(Derivee1& d)
    {
    Interface* brol(this); // <- Pas de problème
    Interface* trol(&d); // <- Refuse de compiler
    }
    T'as oublié void :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void Derivee2::someStuff(Derivee1& d)
    {
    Interface* brol(this);
    Interface* trol(&d);
    }
    Le code suivant compile sur le site http://coliru.stacked-crooked.com/ :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include <iostream>
     
    class SousClasse
    {};
    class SousClasseDerivee1 : public SousClasse
    {};
    class SousClasseDerivee2 : public SousClasse
    {};
     
    class Interface
    {};
    template<typename T>
    class Abstraction : public Interface
    {};
     
    class Derivee1 : public Abstraction<SousClasseDerivee1>
    {};
    class Derivee2 : public Abstraction<SousClasseDerivee2>
    {
    void someStuff(Derivee1& d);
    };
     
    void Derivee2::someStuff(Derivee1& d)
    {
    Interface* brol(this);
    Interface* trol(&d);
    }
     
    int main()
    {
        std::cout << "test";
        return 0;
    }
    EDIT : Ah, tu as déjà corrigé ton problème.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/01/2011, 19h00
  2. Réponses: 0
    Dernier message: 17/12/2009, 11h52
  3. Réponses: 3
    Dernier message: 18/11/2009, 16h48
  4. Problème de cast d'objet à la deuxième fois
    Par vilveq dans le forum Flex
    Réponses: 4
    Dernier message: 06/10/2009, 14h30
  5. Réponses: 8
    Dernier message: 12/04/2007, 11h32

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