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 :

Un template qui prend un vector en paramètre


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 18
    Par défaut Un template qui prend un vector en paramètre
    Bonjour à tous

    J'ai une méthode qui est sensée prendre des données en paramètre pour les envoyer. J'ai fais un template pour recevoir plusieurs types, ça fonctionne nickel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<typename T>
    void ServerModele::envoyer(T message, int longueur, bool paquet) {
    Là ou ça se corse, c'est si ces données sont contenues dans un vecteur, dans mon code c'est un QVector<quint16>, mais ça pourra très bien être autre chose.

    Ma question est: comment faire passer carrément le container en paramètre et en template ? (J'ai pas du tout envie de passer QVector en brut, ça peut être autre chose :s)

    Je sais que c'est un peu tordu, j'ai pas trouvé grand chose sur google.

    Toute info sera la bienvenue, merci d'avance pour votre participation

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Un vector c'est un type comme un autre.. tu peux le passer en paramètre.. Va falloir préciser là.

  3. #3
    Membre averti
    Inscrit en
    Février 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 18
    Par défaut
    Avec le code que j'ai posté, en lui envoyant un vector<quint16>, de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    QVector<quint16> messageAEnvoyer;
    for(int i = 0; i < TAILLE_HEADER; i++)
        messageAEnvoyer.push_back(messageRecu[i]);
        //fonctionnait parfaitement bien avec ma fonction jusqu'a ce que je la passe en template
     
    envoyer(messageAEnvoyer);
    // envoyer<QVector<quint16>>(messageAEnvoyer) ne compile pas non plus
    à ma méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<typename T>
    void ServerModele::envoyer(T message, int longueur, bool paquet) { }
    le compilo me jette:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    undefined reference to
    'void ServerModele::envoyer<QVector<unsigned short> >(QVector<unsigned short>, int, bool)'
    collect2 returned 1 exit status
    Peux-être que la déclaration de ma méthode est bonne mais que l'appel est mauvais ?

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut
    Pourait-on avoir le code exacte avec servermodele.envoyer(message_a_envoyer, 300 , 1)(par ex) ?

  5. #5
    Membre averti
    Inscrit en
    Février 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 18
    Par défaut
    Euh si tu veux dire la réponse du compilateur, c'est ce qui est affiché à la fin du message ci-dessus. Si tu veux le code de la méthode:

    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
    // ServerModele.h
     
    void envoyer(T message, int longueur = -1, bool paquet = true);
     
    // ServerModele.cpp
     
    template<typename T>
    void ServerModele::envoyer(T message, int longueur, bool paquet) {
     
        if(paquet) {
            QByteArray paquet;
            QDataStream out(&paquet, QIODevice::WriteOnly);
     
            out << (quint16) 0;
            try {
                for(int i = 0; i < message.size(); i++)
                    out << message[i];
            } catch (...) {
                out << message;
            }
     
            out.device()->seek(0);
            out << (quint16) (paquet.size() - sizeof(T));
     
     
            nouveauClient->write(paquet);
        }
        else {
            if(longueur != -1) nouveauClient->write(message, (qint64) longueur);
            else nouveauClient->write(message);
        }
    }
    En fait la méthode envoyer() sert à envoyer des données dans une socket, avec un comportement défini par les paramètres "longueur" et "paquet". Je dois admettre que je l'ai codé à l'arrache sans trop réfléchir (notamment avec les imbrications de conditions), je voulais surtout tester le fait d'envoyer le vector<quint16>.

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut
    envoyer(messageAEnvoyer);
    est réellement appelée comme sa ?
    car envoyer est une fonction membre.

    De plus, d'après le message du compilateur, cela ressemble plus à un problème de linkage qu'autre chose.

    Est-tu sur d'avoir déclarer tes templates dans le .h ET dans le .cpp ?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/05/2012, 21h33
  2. problème d'une invite qui prend une date en paramètre
    Par soufiane669 dans le forum iReport
    Réponses: 1
    Dernier message: 24/09/2010, 17h48
  3. coder une calculatrice qui prend en paramètre une chaine de caractère
    Par AnozerOne dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 22/05/2010, 17h34
  4. Méthode qui prend un paramètre de type List<MaClasse>
    Par boby62423 dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 11/05/2010, 16h12
  5. Réponses: 3
    Dernier message: 02/09/2009, 17h22

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