Partage
  • Partager sur Facebook
  • Partager sur Twitter

ambiguïté dans les types clients pour le chatt

Qt

    17 février 2018 à 20:06:15

    Bonjour à tout le monde OC;

    je poste ce message car je suis en train de poursuivre le débogage de mon projet de chatt par Qt tel que le cours de Mathieu nous enjoint à le faire.

    J'ai bien avancé grâce aux nombreux intervenants. Il y a encore des points qui bloquent.

    Par exemple celui-ci :

    Dans mon code, un moment donné, j'ai me message d'erreur , le suivant :

    C:\Qt\5.10.0\mingw53_32\include\QtCore\qlist.h:976: erreur : no match for 'operator==' (operand types are 'Client' and 'const Client')
    if (n->t() == t)
    ^

    alors que le code de QT est le suivant

    template<typenameT>
    
    Q_OUTOFLINE_TEMPLATEintQList<T>::indexOf(constT&t,intfrom)const
    
    {
    
    if(from<0)
    
    from=qMax(from+p.size(),0);
    
    if(from<p.size()){
    
    Node*n=reinterpret_cast<Node*>(p.at(from-1));
    
    Node*e=reinterpret_cast<Node*>(p.end());
    
    while(++n!=e)
    
    if(n->t()==t)
    
    returnint(n-reinterpret_cast<Node*>(p.begin()));
    
    }
    
    return-1;
    
    }


    Ce qui m'a amené à me demander si par hasard il n'y aurait pas un bug dans le code Qt. Franchement, je ne pense pas.

    MERCI d'avance pour toute aide.

    Voici le fichier client.h :

    #ifndefCLIENT_H
    
    #defineCLIENT_H
    
    #include<QtNetwork>
    
    #include<QList>
    
    classClient
    
    {
    
    public:
    
    Client(QTcpSocket*socket,QString*pseudo=Q_NULLPTR,QPixmap*avatar=Q_NULLPTR);
    
    QTcpSocket*getSocket();
    
    private:
    
    QTcpSocket*m_socket;
    
    QString*m_pseudo;
    
    QPixmap*m_avatar;
    
    };
    
    void operator<<(QList<Client>clients,Clientclient);
    
    #endif//CLIENT_H



    et voici le fichier client.cpp :

    #include"client.h"
    
    Client::Client(QTcpSocket*socket,QString*pseudo,QPixmap*avatar):m_avatar(avatar)
    
    {
    
    m_socket=newQTcpSocket;
    
    m_socket=socket;
    
    m_pseudo=newQString(*pseudo);
    
    //m_avatar=newQPixmap();
    
    //m_avatar=avatar;
    
    //m_avatar=avatar;
    
    }
    
    QTcpSocket*Client::getSocket()
    
    {
    
    returnm_socket;
    
    }
    
    void operator<<(QList<Client>clients,Clientclient)
    
    {
    
    clients.append(client);
    
    }


    -
    Edité par pseudo-simple 17 février 2018 à 20:47:30

    • Partager sur Facebook
    • Partager sur Twitter
      17 février 2018 à 20:35:08

      Où est l'opérateur de comparaison ?

      -
      Edité par jo_link_noir 17 février 2018 à 20:35:20

      • Partager sur Facebook
      • Partager sur Twitter
        17 février 2018 à 20:47:49

        L'opérateur de comparaison == est quelque chose d'interne à Qt

        C'est du code interne à Qt.

        Je n'ai pas encore étudié à fond les template car ça vient après.

        Apparemment , il s'agit d'un template donc de quelque chose de générique.

        -
        Edité par pseudo-simple 17 février 2018 à 20:59:16

        • Partager sur Facebook
        • Partager sur Twitter
          17 février 2018 à 21:01:06

          Et ta classe Client est aussi une chose interne de Qt ?

          • Partager sur Facebook
          • Partager sur Twitter
            17 février 2018 à 21:09:01

            Non, bien sûr. Ce n'est pas du code source interne à Qt.

            Que veux-tu dire ?

            -
            Edité par pseudo-simple 17 février 2018 à 21:14:46

            • Partager sur Facebook
            • Partager sur Twitter
              17 février 2018 à 22:52:43

              Que tu lises l'erreur. Il n'y a pas plus explicite pourtant: il n'y a pas d'opérateur == pour Client.

              • Partager sur Facebook
              • Partager sur Twitter
                17 février 2018 à 23:18:54

                J'ai ajouté une fonction spéciale d'opérateur == pour Client peu après.

                Apparemment, lorsque je veux utiliser l'opérateur == entre deux instances de QTcpSocket*, ça n'a pas l'air de fonctionner.

                J'ai cherché dans la doc de QTcpSocket* pour voir si l'opérateur== existe, et ça n'a pas l'air d'être le cas. Pourtant , définir un opérateur == m'aurait semblé tout ce qu'il y a de plus naturel, peut-être que quelque chose m'a échappé.

                Voilà la fonction que j'ai écrite et qui bogue à la compilation (la ligne avec le return pose problème et je pense que ça vient du fait que la comparison entre les QTcoSocket* ne passe peut-être pas):

                bool Client::operator==(Client const& a)
                {
                    return(this->getSocket()==a.getSocket());
                }
                


                Merci pour vos idées

                • Partager sur Facebook
                • Partager sur Twitter
                  17 février 2018 à 23:45:35

                  Ce que tu dis est incohérent. Tout les pointeurs on un opérateur ==, et non, ce n'est pas logique de pouvoir comparer 2 classes abstraites.

                  Donc je ne sais pas ce que tu veux comparer, mais quelque chose entre ton code et ce que tu dis n'est pas d’équerre.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 février 2018 à 5:14:59

                    Mon Client est une classe composée de 3 attributs , donc un QTcpSocket * qui le caractérise.

                    Je cherche à comparer deux éléments de type QTcpSocket*, que j'obtiens par l'accesseur getSocket() que j'ai implémenté.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 février 2018 à 5:32:25

                      Ok, ce n'est pas la comparaison le problème, mais le prototype des fonctions. Encore une fois, tu ne lis pas convenablement les erreurs.

                      • Les opérateurs de comparaison doivent être constant lorsqu'ils sont implémentés en tant que fonction membre. http://en.cppreference.com/w/cpp/language/operator_comparison
                      • Seules les fonctions membres const peuvent être utilisées avec une variable const. La version actuelle de getsocket ne peut pas être utilisée.

                      -
                      Edité par jo_link_noir 18 février 2018 à 5:32:59

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 février 2018 à 21:00:07

                        Bonjour,

                        il semble que j'ai résolu ce problème.

                        Maintenant , il y a encore un message que je ne parviens pas encore à décoder, le voici :

                        C:\....\build-TP_Reseau_QT-Desktop_Qt_5_10_0_MinGW_32bit-Debug\debug\moc_fenclient.cpp:95: erreur : undefined reference to `FenClient::on_boutonConnexion_clicked()'

                        Les signaux et slot n'ont pas de problèmes apparents.

                        Pourtant, le compilateur m'envoie 8 messages d'erreur similaires (chaque message est d'erreur est associé à un des SLOT), avec cette histoire de fichier moc_fenclient.cpp dont je ne sais pas de quoi il s'agit.

                        Une aide serait la bienvenue. Il s'agirait d'un problème de type "build". Je ne comprends pas pourquoi j'ai ce message d'erreur alors qu'avant mon passage de Qt 59 à 5.10, les signaux et les slots. j'ai pensé à autre chose, mais je ne pense pas que ça vienne de là : peut-être la nouvelle de syntaxe de Qt 5 pour les signaux et slots, ça m'étonnerait franchement.

                        Des idées de débogage pour ces messages d'erreurs seraient bienvenues.

                        Merci

                        • Partager sur Facebook
                        • Partager sur Twitter

                        ambiguïté dans les types clients pour le chatt

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown