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

Langage C++ Discussion :

template C++ : probleme


Sujet :

Langage C++

  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut template C++ : probleme
    Bonjour,

    C'est la première fois que j'utilise des templates sous C++ et j'ai un petit probleme, j'ai deux classes, Maillon et Liste pour faire une liste chainée.

    Voici donc les fichiers que j'ai :

    Client.cc (le main)

    Maillon.h
    Maillon.inl

    Liste.h
    Liste.inl


    Respectivement dans chaque .h, à la fin j'inclus le .inl et dans le Client.cc j'inclus les deux .h


    J'ai d'abord fait le template seulement avec la classe Maillon et ca fonctionne, le probleme vient quand je veux passer la classe Liste également en templates.

    Est-ce que le probleme peut venir du fait que dans la classe maillon j'ai un friend :
    friend class Liste; ???

    J'utilise T pour le type maillon
    template <class T>
    class Maillon
    { ...

    Est-ce que je dois utiliser une autre lettre (ex C)pour dans la liste ou ca ne fait rien ?


    Merci
    Bonne journée
    ++

  2. #2
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut
    Ah ben en fait j'ai réussi à compiler mais le "friend class Liste<T>" ne fonctionne pas apparement...

    On ne peut pas utiliser les friend avec des templates ?

    Merci
    ++

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    et avec un typename devant ?

  4. #4
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut
    C'est quoi "typename" exactement ? ca sert a quoi ? quand ? On l'utilise comment ?
    Je ne l'ai jamais utilisé donc est-ce parce que j'en ai jamais eu l'utilité ou parce que j'ai oublié un truc...


    Autrement pour mes problemes, on va oublier ce que j'ai dis dans mes différents messages, j'ai réussi à compiler quelque chose mais j'ai un probleme lorsque je redéfini l'opérateur << pour utiliser avec cout.

    voici Maillon.h
    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
    template <class T>
    class Maillon
    {
    	template <class C> friend class Liste;
     
    	private:
    		T valeur;
    		Maillon<T>* suivant;
     
    	public:
    ....
    ....
    ....
     
    		// Operateur de sortie ecran
    		// Affiche un maillon (sa valeur)
    		template <T> friend ostream& operator<<(ostream&, const Maillon<T>&);
     
    };
    Et dans Maillon.inl j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Operateur de sortie ecran
    // Affiche un maillon (sa valeur)
    template <class T>
    ostream& std::operator<<(std::ostream& o, const Maillon<T>& m) 
    {
    	o << m.valeur;
     
    	return o;
    }
    Et c'est la qu'il y a un probleme, lorsque je mets m.valeur, il me dit que valeur is private alors que j'ai défini la fonction comme friend donc logiquement il a le droit d'accéder à valeur non ? A moins que j'ai oublié un truc ?

    Merci

    ++

  5. #5
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    salut
    moi je aussi je suis pas bien doué avec les template

    dans la class maillon:
    template <class U> friend ostream& operator<<(ostream&, const Maillon<U>&);

    et pas

    template <T> friend ostream& operator<<(ostream&, const Maillon<T>&);

    sinon tu as un
    Maillon<T>* suivant;
    je crois que tu peux mettre partout où tu as des Maillon<T>, Maillon tout court ça sera équivalent à Maillon<T> par défaut

  6. #6
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut
    Bon pour ce problème d'accès, soit je mettais valeur en public mais c'est pas très bon, soit, et c'est ce que j'ai fais, j'ai créé une méthode GetValeur qui me renvoie la valeur comme ca il n'y a plus de probleme.

    J'obtiens donc et ca fonctionne :

    Dans Maillon.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <T> friend ostream& std::operator<<(ostream&, Maillon<T>&);
    Dans Maillon.inl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Operateur de sortie ecran
    // Affiche un maillon (sa valeur)
    template <class T>
    ostream& std::operator<<(ostream& o, Maillon<T>& m) 
    {
    	o << m.GetValeur();
     
    	return o;
    }
    Ensuite, j'ai essayé de faire sur le meme modèle, de surcharger l'opérateur << pour afficher ma liste, j'ai donc fait :

    Dans Liste.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <T> friend ostream& std::operator<<(ostream&, Liste<T>&);
    Dans Liste.inl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <class T>
    ostream& std::operator<<(ostream& o, Liste<T>& l) 
    {
    	o << *l.tete;
     
    	return o;
    }
    J'ai essayé d'afficher que le premier élément de la liste pour déja voir si ca fonctionne avant de la parcourir entierement, logiquement là à l'intérieur ca revient a faire un cout sur un maillon et donc ca doit fonctionner (ca fonctionne d'ailleurs, je l'ai essayé dans une autre méthode).

    Seulement le probleme c'est que quand j'ai ce bout de code dans liste.inl ca ne compile plus, ca fou tout en l'air, et j'ai l'impression que ca me "cache" la fonction surchargé << pour le maillon parce que du coup il n'arrive plus à m'afficher un maillon quand il y a ce code.

    J'ai donc pensé que l'un couvrait l'autre et donc du coup il ne reconnait plus celui pour maillon mais c'est pas logique ca doit surcharger l'opérateur normalement non ?

    Merci
    ++

  7. #7
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut
    Aaah rectification ca fonctionne, j'avais des std:: en trop... lol

    Mais alors du coup le seul problème qui persiste c'est que les friend ne fonctionnent pas vraiment puisque a chaque fois dans mes fonctions de l'opérateur << ca m'interdit l'acces à mes champs et me dit que les champs que je veux accéder sont private !

    une idée ?


    La seule solution est de passer par des fonctions Getxxx ?? qui renvoient les propriétés en private ?

  8. #8
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    tu as sauté mon message ?

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    J'ai pas analyse en detail, mais j'ai comme l'impression que http://www.developpez.net/forums/sho...34&postcount=9
    doit te donner la solution.

  10. #10
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut
    ah oui désolé acx01b, j'avais pas vu mais effectivement c'est ca, il ne faut pas mettre la même classe T

    Bon ben super ca fonctionne


    Mais euh alors y a-t-il une différence entre typename et class ? ou ca revient au meme ?

  11. #11
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut

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

Discussions similaires

  1. [template] petit probleme d'instanciation
    Par ikeas dans le forum Langage
    Réponses: 42
    Dernier message: 12/09/2014, 09h24
  2. Template et probleme au linkage (seulement windows)
    Par elraton dans le forum Langage
    Réponses: 2
    Dernier message: 16/09/2010, 16h22
  3. Template Singleton problem
    Par grigoux dans le forum Langage
    Réponses: 3
    Dernier message: 25/10/2009, 23h46
  4. Réponses: 2
    Dernier message: 02/08/2005, 11h44
  5. probleme template me renvoi qq chose en trop
    Par Triangle dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 29/07/2005, 15h01

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