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 :

souci classe template et surcharge operateur


Sujet :

Langage C++

  1. #1
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Points : 158
    Points
    158
    Par défaut souci classe template et surcharge operateur
    Bonjour,
    je tente de redefinir l'operateur= de ma classe template...j'ai regardé dans des bouquins et sur les forums mais je n'arrive pas à m'en sortir
    je suis sur visual express 2005, sur un forum j'ai lu que l'utilisation des template merdent un peu avec express...
    je poste le code des fois que j'ai fait une erreur sur l'utilisation!

    voici le code:

    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
     template<u8 W,u8 I, bool S>
    class test
    {
    private:
       u8 mw,mi;
           bool ms;
     
    public:
       test()
               {
            mw=W;mi=I;ms=S;
       };
     
      test(const test &op)
              {
          mw=op.mw;
          mi=op.mi;
          ms=op.ms;
      };
     
           test(u8 Wi,u8 Ii, bool Si)
               {
          mw=Wi;
          mi=Ii;
          ms=Si;
       };
     
      ~test(){};
     
        test& operator=(const test  &val);
    };
    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
     
    template<u8 W,u8 I, bool S>
    test<W,I,S>& test<W,I,S>::operator=(const test &val)
    {
        //blablabla
        return *this;
    }
     
    void main (int argc, char *argv[])
    {
        test<8,8,true> gerard1;
        test<5,1,false> gerard2;
     
        gerard1=gerard2;  :evilred:
    }
    ==>
    erreur de compil:
    src\ac_fixed_dem_test_main.cpp(81) : error C2679: '=' binaire : aucun opérateur trouvé qui accepte un opérande de partie droite de type 'test<W,I,S>' (ou il n'existe pas de conversion acceptable)
    with
    [
    W=5,
    I=1,
    S=false
    ]
    t:\G3_ALGO_FIXED\2\algo_simulator_2g\g3_fixed2_loc_eng\algo_simulator_2g\simulator_2g_testu\ac_fixed_dem_test\ince\type_ac_fixed.hpp(1261): peut être 'test<W,I,S> &test<W,I,S>::operator =(const test<W,I,S> &)'
    with
    [
    W=8,
    I=8,
    S=true
    ]
    lors de la tentative de mise en correspondance de la liste des arguments '(test<W,I,S>, test<W,I,S>)'
    with
    [
    W=8,
    I=8,
    S=true
    ]
    and
    [
    W=5,
    I=1,
    S=false
    ]

    merci d'avance

    ====

  2. #2
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 110
    Points
    110
    Par défaut
    Salut,

    Ne dois-tu pas indiquer a ton compilaeur a la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test& operator=(const test  &val);
    Que ta classe test est une classe template ? Comme te l'indique ton compilateur :
    [CODE]peut être 'test<W,I,S> &test<W,I,S>::operator =(const test<W,I,S> &)'CODE]
    D'autre part, l'utilisation que tu fais de ta classe est assez bancale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    test<8,8,true> gerard1;
    test<5,1,false> gerard2;
    gerard1=gerard2;  :evilred:
    L'objet gerard1 ne peut EN AUCUN CAS etre egal a l'objet gerard2 car ce sont 2 instanciations de ta classe template avec des 'types' differents ! Ca ne ressort pas clairement ici mais imagine que tu aies l'exemple suivant :
    Une instanciation de ClasseTemplate<float> (ct1) et une de ClasseTemplate<int> ct2. Appeler ct2 = ct1 est maladroit dans la mesure ou convertir un float en int fait perdre de l'info. A fortiori pour des types non primitifs ca fonctionnerai encore moins bien.

  3. #3
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 110
    Points
    110
    Par défaut
    D'autre part, ton constructeur de recopie est ici inutile :
    Tu n'effectue pas d'allocation dynamique de memoire dans ta classe (enfin pour l'instant et de ce que l'on en voit), aussi, il est preferable d'utiliser le constructeur de recopie genere par ton compilateur (donc de ne pas l'implementer toi-mem DU TOUT) qui effectue une recopie bit a bit quasi parfaite du point de vue performance.
    Dans le cas d'allocation dynamique de memoire, il FAUT surcharger :
    - le destructeur pour liberer les zones memoires allouees (certains compilateur generent un destructeur par defaut qui ne supprime que les references sur les zones memoires :/)
    - le constructeur de recopie pour reallouee une nouvelle zone memoire au nouvel objet (et eviter que 2 instances de ta classe n'utilisent la meme zone memoire pour un de leurs attribut).

    Bon courage

  4. #4
    screetch
    Invité(e)
    Par défaut
    je ne suis pas sur du bien fondé de la correction d'une partie juste du programme simplement car elle est inutile (ou explicite au lieu d'implicite ou quoi).

    pour ceux qui ont les yeux sensibles dites vous juste que meme si c'est en trop, ca marche.

  5. #5
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 110
    Points
    110
    Par défaut
    cad ?

  6. #6
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Points : 158
    Points
    158
    Par défaut
    pour info,
    l'exemple que j'ai mis est un truc simple qui montre bien mon problème

    le pb est que je n'arrive pas a redéfinir l'opérateur= avec 2 opérandes <a,b,c> et <a',b',c'>...
    peut importe ce que je fais dedans ou que ce soit bancal, le souci n'est pas la

    pour:
    ==============================
    Ne dois-tu pas indiquer a ton compilateur a la ligne :
    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test& operator=(const test  &val);
    Que ta classe test est une classe template ? Comme te l'indique ton compilateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    peut être 'test<W,I,S> &test<W,I,S>::operator =(const test<W,I,S> &)'
    =============================
    j'ai regardé sur ce site:
    http://www.nawouak.net/?doc=course.c...plates+lang=fr

    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
     
    #ifndef _VECTEUR_H_
    #define _VECTEUR_H_
     
     #include "iterateur.hpp"
     
     template <typename T> class Iterateur;
     
     template <typename T> class Vecteur {
      protected:
       T * _t; // Tableau d'éléments.
       int _n; // Nombre d'éléments.
     
      public:
       Vecteur(int = 10);
       Vecteur(const Vecteur &);
     
       Vecteur & operator=(const Vecteur &);
       const T & operator[](int) const;
       T &       operator[](int);
     
       Iterateur<T> begin() const;
       Iterateur<T> end() const;
     };
     
    #endif
    ======================

    apparemment, pas besoin de préciser dans le prototype.

    j'ai testé un autre truc,si je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template<>
    test<8,8,true>& test<8,8,true>::operator=(const test &val)
    {
        //blablabla
        return *this;
    }
     
    main:
       test<8,8,true> gerard1;
       test<8,8,true> gerard2;
       gerard1=gerard2;
    ca marche.

    j'essaye alors:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template<u8 W,u8 I, bool S> template<u8 a,u8 b,bool c>
    test<W,I,S>& test<W,I,S>::operator=(const test<a,b,c>  &val)
    {
        return *this
    }
     
    main:
       test<9,8,true> gerard1;
       test<8,8,true> gerard2;
       gerard1=gerard2;
    ==>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error LNK2001: symbole externe non résolu "public: class test<9,8,1> & __thiscall test<9,8,1>::operator=<8,8,1>(class test<8,8,1> const &)
    il fait pas le lien...arf...je tourne en rond!

  7. #7
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 110
    Points
    110
    Par défaut
    le pb est que je n'arrive pas a redéfinir l'opérateur= avec 2 opérandes <a,b,c> et <a',b',c'>...
    peut importe ce que je fais dedans ou que ce soit bancal, le souci n'est pas la
    Justement SI le probleme est la, comme le montrent tes tests :

    test<8,8,true> gerard1;
    test<8,8,true> gerard2;
    gerard1=gerard2;
    marche mais

    test<9,8,true> gerard1;
    test<8,8,true> gerard2;
    gerard1=gerard2;
    ne marche pas ! A l'execution, test<9,8,true> et test<8,8,true> sont 2 classes differentes ! Aussi, il est normal que ton compilo ne trouve PAS l'operateur public: test<9,8,1>::operator=<8,8,1>(class test<8,8,1> const &) ! Il trouverai test<8,8,1>::operator=<8,8,1>(class test<8,8,1> const &) et test<9,9,1>::operator=<9,9,1>(class test<9,9,1> const &) et meme test<666,888,1>::operator=<666,888,1>(class test<666,888,1> const &) . Je pense que maintenant tu vois ce que je veux dire.

    Bon courage

  8. #8
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Points : 158
    Points
    158
    Par défaut
    Eureka!!!

    grace à ton post:
    ======================
    ne marche pas ! A l'execution, test<9,8,true> et test<8,8,true> sont 2 classes differentes ! Aussi, il est normal que ton compilo ne trouve PAS l'operateur public: test<9,8,1>::operator=<8,8,1>(class test<8,8,1> const &) !
    ======================
    j'ai tenté
    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
    template<u8 W,u8 I, bool S>
    class test{
    private:
        u8 mw,mi;
        bool ms;
    public:
        test()
            {mw=W;mi=I;ms=S;};
        test(const test &op)
            {mw=op.mw;mi=op.mi;ms=op.ms;};
        test(u8 Wi,u8 Ii, bool Si)
            {mw=Wi;mi=Ii;ms=Si;};
        ~test()
            {};
     
        template <class T>
        test& operator=(T const &val)  
        {             
            return(*this);
        }
    ==>comme ca si je di
    test valeur = 16; //ca passe

    de la même manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        template<u8 a,u8 b,bool c>
        test& operator=(const test<a,b,c>& op)
        { 
            //blablabla je fais ma conversion        
            return(*this);
        }
     
     
    main:
        test<9,8,true> gerard1;
        test<8,8,true> gerard2;
     
        gerard1=gerard2;
    c bon ca compile:explication

    En fait, si on utilise des template de fonction il faut que la déclaration ET la définition soient dans le HPP.
    Avant j'avais juste ma déclaration dans le HPP et la définition dans le CPP

    voili voilou, une demi journée de stage perdue mais c'est quand même agréable de trouver la solution!

    merci pour vos post

  9. #9
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 110
    Points
    110
    Par défaut
    N'oublie pas de mettre ton sujet "Resolu"

    Bon courage pour ton stage

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 20/03/2007, 10h51
  2. Surcharge de << avec une class Template ?
    Par elraton dans le forum Langage
    Réponses: 10
    Dernier message: 04/01/2007, 09h34
  3. class template : quelques petits soucis
    Par ToxiZz dans le forum Langage
    Réponses: 1
    Dernier message: 09/02/2006, 23h08
  4. friend surcharge classe template
    Par fridollin dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2005, 21h37
  5. [Surcharge]Operateur<< avec une classe maison
    Par KeNnEdY dans le forum C++
    Réponses: 6
    Dernier message: 14/09/2005, 15h51

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