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 :

operator() avec les templates


Sujet :

Langage C++

  1. #1
    Membre du Club
    Homme Profil pro
    Flutter/java/windev/php/javascript
    Inscrit en
    Octobre 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Flutter/java/windev/php/javascript
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 87
    Points : 52
    Points
    52
    Par défaut operator() avec les templates
    bonjours, je cherche a créer un iterateur sur un container de mon cru mais j'ai un petit soucis sur une méthode.

    j'ai declaré:
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    template<class T>
    class IterListe{
        private:
            ListeTrie<T> liste;
            Noeud<T> *noeud;
     
        public:
            IterListe<T>(ListeTrie<T>& l);
            bool end();
            void reset();
            bool operator++();
            bool operator++(int);
            operator T();
            T& operator& ();
    };
     
    template <class T>
    IterListe<T>::IterListe(ListeTrie<T>& l)
    {
        liste = l;
        noeud = &(l.first);
    }
    template <class T>
    bool IterListe<T>::end()
    {
        return noeud == NULL;
    }
     
    template <class T>
    void IterListe<T>::reset()
    {
        noeud = &(liste.first);
    }
     
    template <class T>
    bool IterListe<T>::operator++()
    {
        if((noeud = noeud->hasNext())==NULL)
            return false;
        else
            return true;
    }
    template <class T>
    bool IterListe<T>::operator++(int i)
    {
        return operator++();
    }
    template <class T>
    IterListe<T>::operator T()
    {
        return noeud->getData();
    }
    template <class T>
    T& IterListe<T>::operator&()
    {
        return noeud->getData();
    }
    et je l'utilise comme tel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IterListe<FederationAdmin> l2(fede);
        for(l2.reset();!l2.end();l2++)
        {
            cout<<(FederationAdmin)l2<<endl;
        }
    J'ai une erreur lors de la compilation sur la ligne en rouge:
    error: no match for ‘operator<<’ in ‘std::cout << IterListe<T>::operator T() [with T = TeamMember]()’|
    je pensais que la surcharge de l'opérateur "operator T()" gérait ceci mais je n'en suis pas tout a fait sur, ni de sa déclaration réel... si quelqu'un à déjà fait ou sait comment faire ça m'aiderait vachement parce qu'il ne me reste plus que cette classe a faire

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    De manière générale, on évite la surchage d'un opérateur T() générique, car les effets de bord peuvent être étranges et dangereux. On préfèrera une fonction explicite (ou, dans ton cas, l'opérateur *() qui fait très bien ce boulot). C++1x change la donne, avec son opérateur de cast marqué du mot clef explicit qui permet de ne pas avoir les effets de bords qu'on connait.

    Pour ton problème spécifique : la syntaxe est correcte (encore qu'on puisse spécifier une version const de l'opérateur, mais c'est autre chose). J'ai du mal à voir le rapport entre FederationAdmin et TeamMember - l'un est un type alias sur l'autre, je présume. Dans ce cas, il doit manquer quelque chose quelque part. Tu peux essayer de mettre l'expression complète entre parenthèses, la précédence de << étant relativement élevée. Tu devrais vérifier aussi l'existence d'une fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ostream& operator<<(std::ostream& o, const TeamMember& tm);
    Attention : ne pas écrire cette fonction sous la forme d'un template, tu aurais des surprises.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre du Club
    Homme Profil pro
    Flutter/java/windev/php/javascript
    Inscrit en
    Octobre 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Flutter/java/windev/php/javascript
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 87
    Points : 52
    Points
    52
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    cout<<"Administrateur:"<<endl<<"-admin"<<endl<<"Chef d'équipe:"<<endl;
        IterListe<TeamMember> l1(equipe);
        for(l1.reset();!l1.end();l1++)
        {
            cout<<(TeamMember)l1<<endl;
        }
     
        cout<<"Chef Fédération:"<<endl;
        IterListe<FederationAdmin> l2(fede);
        for(l2.reset();!l2.end();l2++)
        {
            cout<<(FederationAdmin)l2<<endl;
        }
    j'ai copié la mauvaise erreur, relative a la suite du code qui est identique au précèdent.
    je regarde pour le reste
    merci.


    [edit] j'ai bien
    friend std::ostream& operator<<(std::ostream& s,TeamMember& comp);
    pas de soucis de ce cotes la

    j'ai aussi essayé de mettre tout entre parenthèse mais rien ne change.
    pour le "const", j'y ai pensé mais cela change quoi dans ce cas précis?

    sinon pour "operator *()", je vois pas. le compilateur me dit que je dois spécifier un type...
    et operator T*() me retourne cette erreur:

    error: no matching function for call to TeamMember::TeamMember(IterListe<TeamMember>&)’|
    il essayerait de faire une copie en prenant mon iterateur comme objet de base?

    en tout cas merci, ça me motive à trouver de savoir que c'est pas si simple que ça ^^

  4. #4
    Membre du Club
    Homme Profil pro
    Flutter/java/windev/php/javascript
    Inscrit en
    Octobre 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Flutter/java/windev/php/javascript
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 87
    Points : 52
    Points
    52
    Par défaut
    en utilisant l'operateur &()

    en changeant l'appel comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IterListe<TeamMember> l1(equipe);
        for(l1.reset();!l1.end();l1++)
        {
            cout<<(TeamMember&)l1<<endl;
        }
    cela a l'air de fonctionner (j'ai juste un petit soucis avec mon pointeur de nœud qui n'est pas bien initialisé a première vu.
    mais cela reste étrange je trouve...

  5. #5
    Membre du Club
    Homme Profil pro
    Flutter/java/windev/php/javascript
    Inscrit en
    Octobre 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Flutter/java/windev/php/javascript
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 87
    Points : 52
    Points
    52
    Par défaut
    ah bah non, en fait il tente de passer dans l'operateur:

    ostream& operator<<(ostream& s, TeamMember& comp)
    sans passer par mon opérateur de l'iterateur, du coups j'ai un iterateur dans une référence de TeamMember et ça plante, logique...
    j'en reviens au problème de mon operator T().



    je viens de tester mon iterateur avec des int tel que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        ListeTrie<int> liste;
        liste.setComparateur(compareInt);
        liste.add(1);liste.add(4);liste.add(19);liste.add(40);
        IterListe<int> l(liste);
        for(l.reset();!l.end();l++)
        {
            cout<<(int)l<<endl;
        }
    et cela fonctionne parfaitement... cela viendrait de mes classes teamMember ou FederationAdmin??

    au passage ceci fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cout<<"Administrateur:"<<endl<<"-admin"<<endl<<"Chef d'équipe:"<<endl;
        for(int i = 0; i< equipe.size; i++)
        {
            cout<<equipe[i]<<endl;
        }
        cout<<"Chef Fédération:"<<endl;
        for(int i = 0; i< fede.size; i++)
        {
            cout<<fede[i]<<endl;
        }

  6. #6
    Membre du Club
    Homme Profil pro
    Flutter/java/windev/php/javascript
    Inscrit en
    Octobre 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Flutter/java/windev/php/javascript
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 87
    Points : 52
    Points
    52
    Par défaut
    le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TeamMember t((TeamMember)l1);
    cout<<t<<endl;
    fonctionne parfaitement mais toujours pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<<(TeamMember)l1<<endl;
    je vais le laisser comme ça pour le moment mais bon...

  7. #7
    Invité
    Invité(e)
    Par défaut
    Ton operateur de sortie(operator<<) prend TeamMember par référence non-constante(voir la signature indiquée par Emmanuel Deloget)

    Aprèes le code de ton iterateur ne me parait pas très bon : comme dit précedemment utilisent plutot l'operateur*() que l'operateur de cast, les operateurs d'incrémentation n'ont pas la bonne sémantique et la surcharge de l'operateur& ne me semble pas très appropriée

Discussions similaires

  1. wpf: probleme avec les templates
    Par mk.wassim dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 18/03/2009, 17h54
  2. [Smarty] Debut avec les templates
    Par Arnich dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 22/11/2007, 18h35
  3. probleme avec les templates d'un formview
    Par devdotnet dans le forum ASP.NET
    Réponses: 2
    Dernier message: 01/11/2007, 09h32
  4. Erreur de link avec les templates
    Par suiss007 dans le forum C++
    Réponses: 6
    Dernier message: 04/01/2007, 11h09
  5. Probleme avec les templates
    Par TeC_MaN dans le forum C++
    Réponses: 2
    Dernier message: 08/01/2006, 14h53

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