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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    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 confirmé
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    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 confirmé
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    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 confirmé
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Par défaut
    cad ?

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    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!

+ 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