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

Discussion :

no match for operator=

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 22
    Points : 21
    Points
    21
    Par défaut no match for operator=
    Bonsoir,
    Je débute avec Qt et je rencontre une erreur qui m'intrigue. Voici le code source de mes deux fichiers:

    Main.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <QApplication>
    #include <QPushButton>
    #include "Fenetre.cpp"
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        Fenetre fenetre;
        fenetre.show();
        return app.exec();
    }
    Fenetre.cpp :
    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
    #include <QWidget>
    #include <QPushButton>
    class Fenetre: public QWidget
    {
    private:
        QPushButton bouton1;
     
    public:
        Fenetre():QWidget()
        {
            setFixedSize(300,400);
            bouton1 = new QPushButton("Quitter", this);
            bouton1.move(60,60);
            QObject::connect(bouton1, SIGNAL(clicked()), qApp, SLOT(quit()));
        }
    };
    et voici l'erreur:

    QtHello/Fenetre.cpp:12: erreur : no match for ‘operator=’ in ‘((Fenetre*)this)->Fenetre::bouton1 = (((const QString&)(& QString(((const char*)"Quitter")))), (operator new(40u), (<statement>, ((QPushButton*)<anonymous>))))’

    Cela veut-il dire que je dois définir l'opérateur d'affectation ? Alors que la classe en question est QPushButton qui fait partie de Qt ?

    Je vous remercie d'avance pour toute réponse.
    Ben

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Tu fais une allocation dynamique et le résultat n'est pas mis dans un pointeur mais dans une valeur. D'où l'erreur.
    Je ne sais pas comment fonctionne Qt mais c'est probablement une solution comme ça :
    Code pointeur : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    class Fenetre: public QWidget
    {
    private:
        QPushButton *bouton1;
     
    public:
        Fenetre():QWidget()
        {
            setFixedSize(300,400);
            bouton1 = new QPushButton("Quitter", this);
            bouton1->move(60,60);
            QObject::connect(bouton1, SIGNAL(clicked()), qApp, SLOT(quit()));
        }
    };
    ou :
    Code initialisation constructeur : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    class Fenetre: public QWidget
    {
    private:
        QPushButton bouton1;
     
    public:
        Fenetre():QWidget()
        ,bouton1("Quitter",this) // mais ça, le this en paramètre, ça me gêne
        {
            setFixedSize(300,400);
            bouton1.move(60,60);
            QObject::connect(&bouton1, SIGNAL(clicked()), qApp, SLOT(quit()));
        }
    };

  3. #3
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    Tu essaies d'assigner un QPushButton * (avec le new QPushButton) à une variable de type QPushButton, donc forcément le compilateur râle.
    Ne sachant pas comment est fait Qt je ne peux pas te conseiller quant à l'utilisation de pointeurs ou pas pour les éléments graphiques de cette API.

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Points : 359
    Points
    359
    Par défaut
    Qt n'a pas forcément de contrainte entre pointeur ou valeur ; cependant:

    1. le code généré par Qt (à partir d'un fichier form .ui) utilise des pointeurs, et la plupart du code Qt utilise plutôt des pointeurs.

    2. Qt intègre une gestion de la mémoire: les QObject peuvent former une hiérarchie, et supprimer un QObject va supprimer tous les QObject enfants.
    La conséquence est que si on n'utilise pas de pointeur, et qu'on passe this en parent d'un QObject "valeur", ce QObject sera par défaut détruit 2 fois (une fois par la relation parent/enfant des QObject, et une fois parce que détruire un objet détruit tous les membres). Il y a moyen de régler ce souci, mais il faut en tenir compte.

    Je conseille donc de passer par des pointeurs, comme dans le premier exemple de @3DArchi.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 22
    Points : 21
    Points
    21
    Par défaut Merci
    Merci pour vos réponses ça fonctionne maintenant. J'ai de vielles habitudes du Java en ce qui concerne la création des objets (pour me trouver une excuse ).
    En utilisant un pointeur puis en accédant à la méthode move de QPushButton par -> et non par . tout va bien.

    Bonne soirée

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

Discussions similaires

  1. 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, 12h37
  2. error: no match for 'operator='
    Par MastahPommeh dans le forum Débuter
    Réponses: 6
    Dernier message: 06/04/2011, 18h22
  3. Problème : no match for operator
    Par Titiii25 dans le forum C++
    Réponses: 4
    Dernier message: 20/04/2009, 18h56
  4. Illegal mix of collations for operation ' IN '
    Par Jasmine80 dans le forum Requêtes
    Réponses: 9
    Dernier message: 23/01/2009, 16h28
  5. [erreur] matching Java operation for WSDD
    Par biozaxx dans le forum Services Web
    Réponses: 3
    Dernier message: 30/05/2008, 16h28

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