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 :

error: no match for 'operator='


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 11
    Points : 6
    Points
    6
    Par défaut error: no match for 'operator='
    Bonjour,
    voici l'erreur exacte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: no match for 'operator=' in 'l2 = ListeObjet::operator+(ListeObjet&)(((ListeObjet&)(& l2)))
    dans mon main j'ai trois ListeObjet l1 et l2
    et je fais la surcharge de l'opérateur= fonctionne très bien.

    pour la surcharge de l'opérateur+ c'est une autre histoire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ListeObjet ListeObjet::operator+(ListeObjet &l)
    {
    	ListeObjet l3;
    	l3=*this;
    	l3+=l;
    	std::cout<<l3;
    	return l3;
    }
    le soucis semble être le type de retour.
    Quand je retourne une référence l'erreur disparait mais la liste retourné est vide alors qu'elle est bien construite, ce que je vérifie en l'affichant avant de la retourner.
    Si je retourne un pointeur ça marche parfaitement bien
    En revanche si je retourne un ListeObjet j'ai cette erreur. et je n'arrive pas a comprendre ce qui ne va pas

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Citation Envoyé par MastahPommeh Voir le message
    le soucis semble être le type de retour.
    Non le soucis, c'est ce que te dis explicitement le compilateur: il n'y a pas d'opérateur d'affectation ( operator = ) pour ta classe ListeObjet.

    Citation Envoyé par MastahPommeh Voir le message
    Quand je retourne une référence l'erreur disparait mais la liste retourné est vide alors qu'elle est bien construite, ce que je vérifie en l'affichant avant de la retourner.
    Si je retourne un pointeur ça marche parfaitement bien
    Tu ne nous dis pas tout. Car selon le code que tu nous montre, si tu retourne l3, par pointeur ou par référence, ça ne peut pas fonctionner. Car l3 est construit sur la pile et sera donc détruit à la sortie de l'operateur +. Donc le pointeur ou la référence ne seront plus valides.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    si j'ai bien un operator= dans ma classe je l'ai testé de toutes les façon possible il marche parfaitement.

    Par référence, en effet l'objet est détruit a la sortie de la fonction en revanche si l3 est un pointeur comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ListeObjet* ListeObjet::operator+(ListeObjet &l)
    {
    	ListeObjet* l3=new ListeObjet();
    	*l3=*this;
    	*l3+=l;
    	return l3;
    }
    c'est le pointeur l3 qui est détruit et non pas l'objet pointé

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Ah d'accord, si tu fais un new oui ça va marcher. Mais c'est très dangereux, car il faudra ensuite le détruire.

    L'erreur dont tu parles dans le premier message, elle s'applique à quelle ligne?
    Peux-tu nous montrer le code de l'opérateur d'affectation et du constructeur par copie?

    Et puis une remarque, la signature de ton operateur + n'est pas bonne. Ça doit être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeObjet ListeObjet::operator+(const ListeObjet &l)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    alors

    dans mon header j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ListeObjet & operator=(ListeObjet &);
    ListeObjet operator+(const ListeObjet &); // j'ai rajouter le const comme tu me l'as fait remarqué
    ensuite mon constructeur par copie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ListeObjet::ListeObjet(const ListeObjet &l){
    	CelluleObjet* temp=l.debut;
    	debut=new CelluleObjet(*temp);
    	courant=0;
    	temp=temp->getSuivant();
    	avancer();
    	while(temp->getSuivant()!=0)
    	{
    		courant->setSuivant(new CelluleObjet(*temp));
    		temp=temp->getSuivant();
    		avancer();
    	}
    	courant->setSuivant(new CelluleObjet(*temp));
    }
    mon opérateur d'affectation :
    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
     
    ListeObjet & ListeObjet::operator=(ListeObjet &l)
    {
    	this->allerDebut();
    	while(!estVide())
    	{
    		this->supprimer();
    	}
    	l.allerDebut();
    	Objet p;
    	while(!l.estFin())
    	{
    	    l.avancer();
    		p=l.courant->getObjet();
    		inserer(p);
    	}
    	return *this;
    }
    et enfin mon main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     ListeObjet l=ListeObjet();
        ListeObjet l2=ListeObjet();
        Objet o=Objet();
        l.inserer(o);
        l.inserer(o);
        l2=l+l;                                    // c'est la ligne qui pose soucis
        cout<<l2;

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Ton opérateur d'affectation n'est pas bon non plus. Ça doit être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeObjet & operator=(const ListeObjet &);
    De plus, ça c'est pas bon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeObjet l=ListeObjet();
    il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeObjet l; // tout court
    Une fois modifié, si ça ne marche toujours pas, donnes-nous le message d'erreur et à quelle ligne il s'applique.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    c'était les const qui n'allait pas, merci beaucoup maintenant je dois tout modifier xD

Discussions similaires

  1. no match for operator=
    Par ben.p dans le forum Débuter
    Réponses: 4
    Dernier message: 18/09/2011, 21h35
  2. Error in deserializing body of request message for operation
    Par lutecefalco dans le forum Windows Communication Foundation
    Réponses: 6
    Dernier message: 28/04/2011, 11h37
  3. error: no match for call to
    Par ikuzar dans le forum Débuter
    Réponses: 1
    Dernier message: 05/04/2011, 11h55
  4. Problème : no match for operator
    Par Titiii25 dans le forum C++
    Réponses: 4
    Dernier message: 20/04/2009, 17h56
  5. [erreur] matching Java operation for WSDD
    Par biozaxx dans le forum Services Web
    Réponses: 3
    Dernier message: 30/05/2008, 15h28

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