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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut template et heritage
    Je continue dans la série code ultra templaté :

    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
    // Classe de base pour nos opérateurs binaires
     
    template <class T, class U> struct BinaryOpBase {
    	BinaryOpBase(T I1, U I2) : It1(I1), It2(I2) {}
     
    	inline void operator ++() {++It1; ++It2;}
     
    	T It1;
    	U It2;
    };
     
    // Spécialisation pour l'addition
     
    template <typename C, class T, class U> struct BinaryOp<C, T, U, Add> : public BinaryOpBase<T, U> {
    	BinaryOp(T I1, U I2) : BinaryOpBase<T, U>(I1, I2) {}
     
    #define MYRESULT (*It1 + *It2)
    	inline __typeof__(MYRESULT) operator *() {return MYRESULT;} //Ligne qui pose probleme
     
    #undef MYRESULT
    };
    Ceux qui ont fait un tour ici : http://loulou.developpez.com/tutorie...metaprog/#L3.1 devraient reconnaître. il s'agit d'un bout de code sur les expressions templates.

    Malheureusement, a la ligne noté, le compilo (gcc) me dit qu'il ne connait pas les variables It1 et It2. Pourtant, on devrait les retrouver par héritage car ils sont définis dans BinaryOpBase . Quelque chose m'échappe . . .

    EDIT: en essayant avec des classes et des public partout, le résultat est le même.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 142
    Par défaut
    J'ai pas essayé (merci d'envoyer des codes complets), mais ça devrait être mieux avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define MYRESULT (*(BinaryOpBase<T, U>::It1) + *(BinaryOpBase<T, U>::It2))

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut
    J'ai deja essayé. Il me dit 'invalid use of non static data member' . It1 et It2 ne sont pas statics, c'est donc normal de ne pas aller les chercher via la classe.

    L'utilisation de this->It1 et this->It2 ne marches pas non plus : invalid use of this (dans le __typeof__ ).

    Les messages d'erreur pour les autres cas sont en double pour le __typeof__ et dans la fonction.

    Pour le code complet, je veux bien mais ca va être gros et je suis pas bien sur que le reste soit très intéressant.

    par contre, si ca peut aider ce code est appellé ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template<int N, class T> inline BinaryOp<Vector<N, T>, typename Vector<N, T>::const_iterator, typename Vector<N, T>::const_iterator, Add> operator +(const Vector<N, T>& v1, const Vector<N, T>& v2) {
    	return MakeAdd< Vector<N, T> > (v1.begin(), v2.begin());
    }
    On notera que j'ai le meme probleme avec le code brut de fonderie du tutorial suivant : http://loulou.developpez.com/tutorie...metaprog/#L3.1

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 142
    Par défaut
    J'ai simplifié car tu n'as pas donné le code entier, mais ceci compile :
    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
     
    template <class T, class U>
    struct BinaryOpBase
    {
    	BinaryOpBase(T I1, U I2) : It1(I1), It2(I2)
    	{
    	}
     
    	inline void operator++()
    	{
    		++It1;
    		++It2;
    	}
     
    	T It1;
    	U It2;
    };
     
    template <typename C, class T, class U>
    struct BinaryOp: public BinaryOpBase<T, U>
    {
    	BinaryOp(T I1, U I2): BinaryOpBase<T, U>(I1, I2)
    	{
    	}
     
    	#define MYRESULT (*(BinaryOpBase<T, U>::It1) + *(BinaryOpBase<T, U>::It2))
    	inline __typeof__(MYRESULT) operator *() {return MYRESULT;} //Ligne qui ne pose plus probleme!
    	#undef MYRESULT
    };
    BinaryOpBase<T, U> est une classe parent, dans ce cas on ne pointe pas un membre statique avec l'opérateur ::.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 142
    Par défaut
    Citation Envoyé par deadalnix Voir le message
    Pour le code complet, je veux bien mais ca va être gros et je suis pas bien sur que le reste soit très intéressant.
    En fait c'est seulement la classe template primaire de BinaryOp qui aurait été intéressante, juste pour pouvoir compiler.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut
    Ahh, c'est celle du tuto, un bonne grosse class bien creuse et plein de vide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <typename C, class T, class U, int Op> struct BinaryOp {};
    BinaryOpBase<T, U> est une classe parent, dans ce cas on ne pointe pas un membre statique avec l'opérateur ::.
    C'est ce que le compilo semble vouloir faire.

    EDIT: Il veux le faire (chercher des membres statiques) dans le __typeof__ en fait. Il va falloir que je trouves comment le remplir autrement . . .

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 142
    Par défaut
    Citation Envoyé par deadalnix Voir le message
    Ahh, c'est celle du tuto, un bonne grosse class bien creuse et plein de vide
    Arf, désolé, j'ai lu ton premier post en diagonale, a pas cliqué sur le lien

    Citation Envoyé par deadalnix Voir le message
    C'est ce que le compilo semble vouloir faire.
    Tu as essayé mon code ?
    Il est normal que tu doives spécifier la classe parent lorsque tu veux pointer un de ses membres. Imagine le cas d'un héritage multiple : comment le compilateur s'en sortirait si une seconde classe parent possédait des membres nommés It1 et It2 ?

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 Ange_blond dans le forum Langage
    Réponses: 8
    Dernier message: 04/05/2009, 15h28
  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