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++

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 18
    Points : 10
    Points
    10
    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 chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Un vector c'est un type comme un autre.. tu peux le passer en paramètre.. Va falloir préciser là.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 18
    Points : 10
    Points
    10
    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 actif

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

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

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 18
    Points : 10
    Points
    10
    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 actif

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    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 ?

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    J'ai peut-être oublié un détail, c'est que j'ai une classe qui hérite de ServerModele. La méthode envoyer est elle aussi héritée. Je n'ai rien marqué concernant les templates dans ma classe fille, c'est peut-être de ça que vient le problème. J'appelle effectivement envoyer(messageAEnvoyer) de cette manière, mais à partir de ma classe fille.

    J'ai bien déclaré les indications pour les templates dans le .h et le .cpp de ma classe mère cependant^^

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    template dans un .cpp? Cherche pas plus loin. (cf faq)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  9. #9
    Membre actif

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    J'ai relu la faq, et en effet il faut pas déclarer de templates dans un .cpp.
    Cependant, je les met dans le .h et dans le .cpp sans avoir de problème.
    Est-ce du a -std=c++0x ? (que j'ai mis en option de compilation)

  10. #10
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Effectivement, je viens moi aussi de lire la FAQ. Pourtant, j'avais déjà utilisé les templates de cette manière et ça fonctionnait très bien.

    Merci de votre aide

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par NoIdea Voir le message
    J'ai relu la faq, et en effet il faut pas déclarer de templates dans un .cpp.
    Cependant, je les met dans le .h et dans le .cpp sans avoir de problème.
    Est-ce du a -std=c++0x ? (que j'ai mis en option de compilation)
    Quel compilateur? (et pour 0x, non). La seule chose qui permettrait de faire ça c'est le mot clef export mais c'est pas supporté par les compilo à ma connaissance.
    Cependant IIRC y'a certains compilos qui laisse passé ce genre de chose.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  12. #12
    Membre actif

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    gcc4.5 sans mot clé export si tu lis le sujet "difficulté avec les template variadiques", tu verras qu'a la fin j'ai poster ma solution et mes templates sont déclarées dans le .cpp et dans le .h

+ 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