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 :

template avec T&


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 48
    Points : 41
    Points
    41
    Par défaut template avec T&
    Bonsoir à tous,
    Je débute en c++ et j'ai deux petites questions:
    1-
    Dans une classe Mat j'ai un truc de ce genre:
    template<typename _Tp> _Tp& at(int y, int x);

    Je ne sais pas comment utiliser la fonction 'at'
    ex:
    Mat im;
    //....
    int c = im.at(x,y); // le compilo me dit qu'il n'existe pas une telle définition dans la classe Mat

    2-
    c'est par rapport à l'utilisation des std::vecteur
    est ce qu'il faut faire:
    vecteur<Object>* vect;
    vecteur<Object*> vect;

    Merci

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,
    1)
    Le type de retour d'une fonction n'intervient jamais dans la signature de celle-ci...

    Du coup, le compilateur n'est pas en mesure de déterminer quel type est utilisé pour le retour de fonction dans une fonction template, et tu dois le préciser par toi même.

    Pour essayer de te faire comprendre le principe, si tu as une fonction template
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename T>
    void doSomething( T & truc)
    {
       /*... blabla */
    }
    Le compilateur saura que, lorsque tu l'appelle avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i/*=truc*/ ;
    doSometing(i);
    il devra remplacer T par... un int.

    Par contre, si la fonction prend la forme (qui est celle que tu observe ici) de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template <typename T>
    T otherThing(/*...*/)
    {
    }
    Le seule moyen pour que le compilateur sache par quel type il devra remplacer T est... de le spécifier explicitement, sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int i = otherThing<int>();
    si tu t'attend à ce qu'elle renvoie un "int" ou de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyObject obj= otherThing<ojb>();
    si tu t'attend à ce qu'elle renvoie... un objet de type MyObject

    2)
    Surement pas la première solution.

    La classe vector dispose de son propre processus de gestion de la mémoire pour représenter les différents éléments qu'elle contient.

    Il ne sert donc à rien de vouloir, toi aussi, commencer à gérer dynamiquement la mémoire alouée à cette classe (c'est d'ailleurs le cas pour toutes les collections de la STL )

    La deuxième solution (vector<Object*>) est une possibilité à envisager dans certains points particuliers:
    • parce que tu veux faire cohabiter des objets de types différents qui héritent de Object (cela sous entend que tu compte profiter du polymorphisme pour les objets contenus dans ta collection )
    • Parce que tu veux disposer de "références" (au sens normal "non C++" du terme) vers des objets dont la durée de vie est gérée par ailleurs. (il faudra alors être attentifs à supprimer systématiquement les références devenues invalides )
    • Parce que tu souhaite insérer dans ta collection des objets créés par ailleurs en en évitant les copies inutiles (il faudra alors vérifier à ce que chaque élément créé à l'aide de new soit détruit à l'aide de delete, au plus tard avant de perdre l'adresse à laquelle la mémoire a été allouée )
    • Pour toute combinaison de ces trois situations
    En dehors de ces cas bien précis, l'utilisation de pointeur est très clairement peu recommandée, et la gestion dynamique de la mémoire que sous-tend l'utilisation de pointeurs dans l'esprit de nombreuses personnes l'est encore moins
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 48
    Points : 41
    Points
    41
    Par défaut
    Merci

    int& i = im.at<int>(i,j); fonctionne parfaitement.

    pour ces précisions

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

Discussions similaires

  1. exception en template avec des typeid
    Par Julien_C++ dans le forum Langage
    Réponses: 8
    Dernier message: 03/01/2007, 13h55
  2. Réponses: 15
    Dernier message: 21/08/2006, 01h41
  3. Utilisation d'un template avec une map
    Par bonano dans le forum Langage
    Réponses: 6
    Dernier message: 09/08/2006, 21h26
  4. [xslt] For-each dans template avec format XML (row)
    Par Steff1985 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/11/2005, 11h14

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