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 :

probleme de compilation


Sujet :

C++

  1. #1
    Membre confirmé Avatar de ludo86
    Homme Profil pro
    Développement applications iOS/android
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développement applications iOS/android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut probleme de compilation
    Bonjour à tous,

    J'ai réaliser un programme qui recréer plus ou moins les éléments de la classe vecteur.
    La plupart des opérations marches bien néanmoins quand je surchage l'opérateur=, le compilo(je suis sur linux) me dit :

    error: no match for ‘operator=’ in ‘v3 = vecteur::operator+(vecteur&)(((vecteur&)(& v2)))’
    Vecteur.h:51: note: candidates are: vecteur& vecteur::operator=(vecteur&)
    Vecteur.h:52: note: vecteur& vecteur::operator=(int)

    Je le comprends de la façon suivante en gros il n'arrive pas à trouver l'opérateur égale. Il y a 2 candidats pour celui ci mais il ne sait lequel choisir. Or je ne comprends pas puisque je viens de le definir.

    Voici mes fichiers sources :
    Vecteur.h
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
     
    class vecteur
     
    {
     
    private:
     
        int taille;
     
        int* tab;
     
     
     
    public:
     
        vecteur();//constructeur par défaut
        ~vecteur();//destructeur
        vecteur(int);// Constructeurs avec la taille du vect.(int)
     
        // Constructeurs par copie(vecteur&)
        vecteur(vecteur&); 
     
        // Acces a la taille du vecteur
        int Taille();
     
        //affichage du vecteur
        //void affichage();
        void affiche();
     
        // acces au element []
        int& operator[](int i);//accès au éléments
     
     
     
        // affectation : =(vecteur),
        vecteur& operator=(vecteur&);
        vecteur& operator=(int);
     
     
     
        // incrementation/decr. : ++(void), ++(int), --(void)
        vecteur& operator++(int);
        vecteur& operator--(int);
     
        // op. binaires : +(vecteur&), -
        vecteur operator+(vecteur&);
        vecteur operator-(vecteur&);
     
        // auto-adition : +=(vecteur&), -=
        vecteur& operator+=(vecteur&);
        vecteur& operator-=(vecteur&);
     
        // op. booleens : ==(vecteur&), <, >, <=, >=
        bool   operator==(vecteur&);
     
        bool  operator!=(vecteur&);
        bool  operator<(vecteur&);
        bool  operator>(vecteur&);
        bool  operator<=(vecteur&);
        bool  operator>=(vecteur&);
     
        // produit scalaire: *(vecteur&)
        int operator*(vecteur&);
     
        //produit par un scalaire
        vecteur operator*( int);
    Vecteur.cc
    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
    32
    33
    34
    35
    36
     
    vecteur& vecteur::operator=(vecteur& copie)
    {
        if(tab!=NULL)
           free(tab);
     
        taille=copie.Taille();
        tab=(int*)malloc(taille*sizeof(int*));
        for(int i=0;i<taille;i++)
            tab[i]=copie.tab[i];
     
        return *this;
    }
     
    vecteur vecteur::operator+(vecteur& vect)
     
    {
    	vecteur somme(*this);
    	return somme+=vect;
     
    }
     
     
    vecteur& vecteur::operator+=(vecteur& vect)
     
     {
     
        for(int i=0;i<vect.Taille();i++)
     
            tab[i]+=vect.tab[i];
     
     
     
        return *this;
     
     }
    client.cc
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
     
     
    #include <iostream.h>
     
     
     
    // Include de l'application
     
    #include "Vecteur.h"
     
     
    int main(int argc, char **argv)
     
    {
     
            cout << "PROGRAMME DE TEST" << endl;
     
     
            // Constructeurs
     
            vecteur v1(3);
    	vecteur v2(4);
    	vecteur v3;
     
    	int taille_v1=v1.Taille();
     
     
            v1[0] = 2;
     
            v1[1] = 4;
     
            v1[2] = 6;
    	v1++;
    	v1--;	
    	v2=1;
    	v1+=v2;
     
    	cout<<"v2  "<<endl;
    	v2.affiche();
     
    	if(v1==v2)
    		cout<<"v1==v2"<<endl;
    	else
    		cout<<"v1!=v2"<<endl;
     
    	v3=v1+v2;//le pb est ici
    	v3.affiche();
     
            cout << "SORTIE TEST" << endl;
     
    }

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il faut que tes opérateurs = prennent leur paramètre par référence constante, sinon tu ne pourras pas passer de temporaires non nommés comme "v1 + v2".
    La référence non constante c'est seulement lorsque le paramètre est modifié par la fonction, ce qui n'est jamais le cas d'un opérateur =.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Hormis le fait que tu aies à passer ton paramètre en référence constante à ton opérateur = comme dit plus haut (le constructeur de recopie également, les autres opérateurs aussi), je ne pense pas que ça soit ça qui te provoque l'erreur de compil.
    L'opérateur + n'est pas celui que je surcharge le plus mais la ligne de ton erreur de compil est celle qui utilise ton opérateur + sur le vecteur.
    Dans les prototypes, ton opérateur + ne prend qu'un seul paramètre. Il en faut deux pour que ça compile

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Dans les prototypes, ton opérateur + ne prend qu'un seul paramètre. Il en faut deux pour que ça compile
    Pas si l'opérateur est membre de la classe (la première opérande étant this dans ce cas).

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Ah bon ?
    Je ne comprends pas comment ça fonctionne alors.
    Un A = B+C va faire comment pour fonctionner : A=B et A=A+C, c'est ça ?

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Non, le + est prioritaire sur le =.

    Donc : B + C (génère un temporaire) puis A = temporaire.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Pour générer un temporaire à partir de B et de C, il a donc besoin d'un opérateur + avec deux paramètres non ?

  8. #8
    Membre confirmé Avatar de ludo86
    Homme Profil pro
    Développement applications iOS/android
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développement applications iOS/android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    Si je te comprends bien il me suffit alors de mettre vecteur& operator=(const vecteur&) et tout se passera mieux!!!!

  9. #9
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pour générer un temporaire à partir de B et de C, il a donc besoin d'un opérateur + avec deux paramètres non ?
    C'est le cas : le premier est implicitement this, le second est celui passé explicitement en paramètre.

    Si je te comprends bien il me suffit alors de mettre vecteur& operator=(const vecteur&) et tout se passera mieux!!!!
    Voilà.

  10. #10
    Membre confirmé Avatar de ludo86
    Homme Profil pro
    Développement applications iOS/android
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développement applications iOS/android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    Ok, j'ai donc effectué le changement à faire cependant il me met l'erreur suivante :
    Vecteur.cc: In member function «vecteur& vecteur::operator=(const vecteur&)»:
    Vecteur.cc:99: erreur: passing «const vecteur» as «this» argument of «int vecteur::Taille()» discards qualifiers

    Voici donc 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
     
    vecteur& vecteur::operator=(const vecteur& copie)
     
    {
        if(tab!=NULL)
     
           free(tab);
     
     
     
        taille=copie.Taille();//ligne 99
     
        tab=(int*)malloc(taille*sizeof(int*));
     
        for(int i=0;i<taille;i++)
     
            tab[i]=copie.tab[i];
     
     
     
        return *this;
     
    }
    la je comprends pas le pb...
    Escusez moi d'avance de poser des question qui doivent paraitre idiote.
    la fonction Taille() fait seulement un return taille;

  11. #11
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Par défaut
    Etant donné que ton paramètre (le vecteur) est passé en const, tu ne peux utiliser que des méthode membres const de ce dernier.

  12. #12
    Membre confirmé Avatar de ludo86
    Homme Profil pro
    Développement applications iOS/android
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développement applications iOS/android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    Ok donc je dois modifier Taille() mais coment bien le faire?
    Je viens de le modifier en faisant ceci : int Taille() const;
    C'est bon le probleme est resolue merci à tous pour votre aide.

    Sans faire de propagande et tomber dans le lyrisme, vous m'aidez vraiment...

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

Discussions similaires

  1. [API][Cup] problem niveau compilation
    Par KoLziG dans le forum Général Java
    Réponses: 1
    Dernier message: 02/01/2005, 19h30
  2. [JSP & TAGLIB] Probleme de compilation
    Par GesMo dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 17/05/2004, 15h03
  3. Probleme de Compilation de la STL
    Par stoluup dans le forum MFC
    Réponses: 3
    Dernier message: 05/05/2004, 17h25
  4. [TP]Probleme de compilation sous TP7
    Par yffick dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 18/12/2003, 20h32
  5. Problemes de compilation avec g++ sous linux
    Par Selimmel dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 19/09/2003, 13h43

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