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

Langage C++ Discussion :

Template et heritage


Sujet :

Langage C++

  1. #1
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut Template et heritage
    Bonjour,

    Voilà j'ai un probleme avec un template sur une classe qui herite déjà d'une autre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template <typename T>
    class FindKindNodes : public osg::NodeVisitor
    la classe NodeVisitor herite elle meme virtuellement d'une autre, des fois que ça change qqch ...

    la compilation de mon template se passe bien, mais lors de l'utilisation, j'ai une erreur error C2664 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    FindKindNodes<osgParticle::ModularEmitter> fnn();
    node->accept(fnn); //erreur ici
    L'erreur est :
    error C2664: 'osg::Node::accept'*: impossible de convertir le paramètre 1 de 'FindKindNodes<T> (__cdecl *)(void)' en 'osg::NodeVisitor &'
    1> with
    1> [
    1> T=osgParticle::ModularEmitter
    1> ]
    la méthode accept() a pour prototype exact :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual void accept(NodeVisitor& nv);
    Mon template herite bien de NodeVisitor ... alors pourquoi le compilateur refuse ?

    N'importe qu'elle idée sera la bienvenue :-)
    Merci.

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FindKindNodes<osgParticle::ModularEmitter> fnn();
    A ton avis, tu as déclaré quoi comme type de variable ?

  3. #3
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    bha je vois pas où est le soucis... il attend une reference, je lui passe une variable locale, pas un pointeur ...
    Ce code fonctionnait tres bien avant que j'ajoute les templates, c'est ce qui me gene en 1er lieu.

  4. #4
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    Bon, ben ça marche en fesant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    osg::ref_ptr<FindKindNodes<osgParticle::ModularEmitter> > fkn = new FindKindNodes<osgParticle::ModularEmitter>();
    node->accept(*(fkn.get()));
    Pas sûr de comprendre pourquoi ... mais bon tant que ça marche sans soucis...

    Note : le ref_ptr est un pointeur intelligent, et le .get() récupere le contenu dudit pointeur.

  5. #5
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FindKindNodes<osgParticle::ModularEmitter> fnn();
    Tu déclares une variable de type fonction retournant un FindKindNodes<osgParticle::ModularEmitter>.
    Je penses que tu voulais écrire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FindKindNodes<osgParticle::ModularEmitter> fnn;
    Pas besoin de pointeur

  6. #6
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    les () c'est juste pour le choix du construteur... enfin je crois, j'ai tjrs fait comme ça.

    Edit : bien vu en effet ça regle le soucis ...

    Je veux bien un petit topo rapide sur ces () alors ... car visiblement j'ai pas tout saisit...

  7. #7
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Le constructeur par défaut n'a pas à être appellé, il est, comme son nom l'indique, par défaut. La sémantique de ces () est la déclaration d'une fonction qui retourne un objet du type défini.

    Ca fonctionne avec le new, étant donné qu'après le new, le compilateur attend un type d'objet, associé ou non à des paramètres de constructeur (ici ()(void)).

    Et pour ta ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    node->accept(*(fkn.get()));
    Je pense que tu devrais plutôt l'écrire comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    node->accept( fkn->get() );
    Ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    node->accept((*fkn).get());
    à moin que ta méthode get renvoi un pointeur et que accept n'attend pas de pointeur.

  8. #8
    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
    appelle le constructeur TYPE::TYPE()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TYPE variable(P1, P2,..,Pn);
    appelle le constructeur TYPE::TYPE(ARG1, ARG2, ..., ARGn)
    définie une variable de type fonction retournant un TYPE.

  9. #9
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    Citation Envoyé par JulienDuSud Voir le message
    à moin que ta méthode get renvoi un pointeur et que accept n'attend pas de pointeur.
    Ce qui est le cas.

    Merci qd meme JulienDuSud;

    Merci pour les précisions 3DArchi, je commençais à ne plus rien voir dans mon code petit à petit.

    Je crois que cette fois c'est definitivement Résolu

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

Discussions similaires

  1. template et heritage de l'operateur =
    Par yan dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2011, 09h22
  2. Restreindre le paramètre d'un Template via Heritage
    Par SamAgace dans le forum Langage
    Réponses: 10
    Dernier message: 03/11/2010, 11h43
  3. Polymorphisme, templates et heritages
    Par Swaraj dans le forum Langage
    Réponses: 2
    Dernier message: 25/06/2009, 18h04
  4. template et heritage
    Par deadalnix dans le forum Langage
    Réponses: 13
    Dernier message: 14/08/2008, 11h34
  5. Réponses: 3
    Dernier message: 22/11/2006, 21h10

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