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 :

[template] renommé (presque) et warning


Sujet :

C++

  1. #1
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut [template] renommé (presque) et warning
    Bonjour,

    je suis en train de refaire la classe vector de la STL (le prétentieux, non c'est juste pour pas perdre la main, pas la perdre plus en tout cas).

    La j'ai un petit souci, j'ai codé ca :
    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
     
       template < class T >
       Vector< T > Vector< T >::operator+( Vector< T > &right){
            Vector< T > vec ;
            vec.lst = lst;
     
            vec.lst.insert( vec.lst.end(), right.lst.begin(), right.lst.end() );
     
            return vec;
       }
     
       template < class T >
       Vector< T >& Vector< T >::operator=(Vector< T > &right){
            lst.clear();
     
            lst.insert( lst.begin(), right.lst.begin(), right.lst.end() );
     
            return *this;
       }
    Ces deux methodes sont declaré comme ca dans le corps e la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Vector operator+(Vector &right);
    Vector& operator=(Vector &right);
    dans mon mon de test des fois ca compil pas (ca c'est normal), mais je ne comprends pas et j aime pas trop

    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
     
    //En haut du main
    //Pour que l'appel soit plus sympa
    //D'ailleur au passage si vous connaiisez mieux que ca ;)
    #define IntVecteur Vecteur<int>
     
    int main( char** argc, int argv ){
       IntVecteur v1;
       IntVecteur v2;
       IntVecteur v3;
     
       //Je leur met quelques valeurs de test
       //...
     
       v3 = v1          // Ca ca marche
       V1 + v2          // Ca ca marche aussi
       v3 = v1 + v2   // La ca coince
    }
    et la on me dit :
    Citation Envoyé par c++ de NetBSD
    error: no match for 'operator=' in 'autre =
    Vector<T>::operator+(Vector<T>&) [with T = int]((&v))'
    IntVector.h:138: error: candidates are: Vector<T>&
    Vector<T>::operator=(Vector<T>&) [with T = int]
    je ne comprends pas si vous pouviez me donner une explication

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //D'ailleur au passage si vous connaiisez mieux que ca ;)
    #define IntVecteur Vecteur<int>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef Vecteur<int> IntVecteur;
    Mais bon là t'as économisé deux caractères...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v3 = v1 + v2   // La ca coince
    v1 + v2 génère un temporaire, qui ne peut pas être pris en paramètre par ton opérateur = puisque celui-ci prend une référence non constante. Tu dois prendre une référence constante, puisque tu ne modifies pas le paramètre à l'intérieur de la fonction. Pareil pour le paramètre de l'opérateur +. Ce dernier devrait également être const.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Vector operator+(const Vector &right) const;
    Vector& operator=(const Vector &right);

  3. #3
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Merci,

    va falloir que je revoie les const

    par contre tant que j'y suis j'ai un warning si tu as le temps d'y jeter un coup d'oeil

    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
     
     In member function `void Vector<T>::resize(int)':
    IntVector.h:72: warning: `std::list<T, std::allocator<_CharT> >::iterator' is
       implicitly a typename
    IntVector.h:72: warning: implicit typename is deprecated, please see the
       documentation for details
     
    //La fonction concerné :
         67 template < class T >
         68 void Vector< T >::resize(int newSize){
         69         list< T > tmp = lst;
         70         lst = *( new list<T>( newSize, 0 ) );
         71
         72         list< T >::iterator it_lst = lst.begin();
         73         list< T >::iterator it_tmp = tmp.begin();
         74
         75         while( it_tmp != tmp.end() ){
         76                 *it_lst++ = *it_tmp++;
         77         }
         78 }
    Merci d'avance

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Essaie avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typename list< T >::iterator it_lst = lst.begin();
    Arrgh, grillé.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lst = *( new list<T>( newSize, 0 ) );
    Outch... Non seulement la liste allouée sur le tas ne sera pas libérée à la sortie de la fonction, mais en plus tu n'auras aucun moyen de le faire. D'autant plus que tu n'as absolument pas besoin d'allouer une liste sur le tas et de faire autant de copies.

  7. #7
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Quel Talent Messieurs !!!

    Je vous remercie

    P.S. : Pour l'allocation oui c'est un peu (c'est un doux euphemisme)crade mais c'est ce que j'avais de plus rapide en tete, (vu que je simule un vecteur on doit pouvoir lui spécifier une taille)

    Sur ce bon week end

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

Discussions similaires

  1. Réponses: 24
    Dernier message: 21/06/2013, 03h45
  2. Warning d'alignement templates+MFC
    Par NiamorH dans le forum C++
    Réponses: 6
    Dernier message: 26/06/2008, 22h15
  3. [phpBB] Renommer un template
    Par crazyvirus dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 28/03/2008, 08h40
  4. [XSLT] template
    Par demo dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 09/09/2002, 11h31
  5. Renommer un repertoire
    Par Sitas dans le forum Langage
    Réponses: 5
    Dernier message: 14/08/2002, 11h56

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