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 :

Questions sur les Map


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Questions sur les Map
    Bonjour à tous.

    Je suis en train de travailler sur un exercice pour le compte d'un cours de programmation. On me demande de créer une classe Date, puis de l'utiliser dans un Calendrier.

    Voici le code épuré de ma classe Calendrier.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
    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
    //calendar.h
     
    #ifndef CALENDAR_H
    #define CALENDAR_H
     
    #include <iostream>
    #include <map>
    #include <string>
    #include "Gregorian.h"
     
    namespace Cal {
     
    template <class C> // ici C sera de type Cal::Gregorian
    class Calendar {
     
    	C today;
    	std::map<std::string, C> theCalendar;
     
    public:
    	Calendar() {};
    	~Calendar() {};
     
    	template <class T>
    	friend std::ostream& operator<<(std::ostream& os, const Calendar<T> &c);
     
    	std::string print() const;
    };
     
     
     
    template <class C>
    std::ostream& operator<< (std::ostream& os, const Calendar<C> &c)
    {
    	os << c.print();
    	return os;
    }
     
    template <class C>
    std::string Calendar<C>::print() const
    {
    	std::string ss;
    	std::map<std::string, C>::iterator map_it;
    	for (it = theCalendar.begin(); it != theCalendar.end(); it++) {
    		ss += (*it).second.print() + " : " + (*it).first.print() + " \n";
    	}
     
    	return ss;
    }
     
    }
    #endif
    Je vous ai enlevé les fonctions inutiles:
    - une fonction set.date pour donner la date sur laquelle travaille le calendrier // initialise today
    - une fonction add.event pour ajouter un élément à la map
    - une fonction remove.event pour enlever un élément

    Bref, en compilant mon code, j'ai l'erreur suivante :
    calendar.h: In member function `std::string Cal::Calendar<C>::print() const':
    calendar.h:77: error: expected `;' before "map_it"
    calendar.h:78: error: 'it' was not declared in this scope
    calendar.h: In member function `std::string Cal::Calendar<C>::print() const [with C = Cal::Gregorian]':
    calendar.h:69: instantiated from `std::ostream& Cal::operator<<(std::ostream&, const Cal::Calendar<C>&) [with C = Cal::Gregorian]'
    calendarTester.cpp:16: instantiated from here
    calendar.h:77: error: dependent-name 'std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,C,std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, C> > >::iterator' is parsed as a non-type, but instantiation yields a type
    calendar.h:77: note: say 'typename std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,C,std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, C> > >::iterator' if a type is meant

    Pourriez-vous m'indiquer où est mon erreur ?


    AUTRES QUESTIONS:

    Le codage de mon "operator<<" est-il correct ? Le but est de permettre un affichage du calendrier par std::cout << cal où cal est de type Calendar<C> ?

    Comment peut-on réorganiser les valeurs d'une map par ordre croissant ou décroissant de valeur de la clé, ou mieux (pour moi) de l'objet auquel la clé correspond ?


    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    L'erreur est toute simple tu déclare ton itérateur avec map_it comme nom puis tu veux l'utiliser ave simplement it comme nom dans ta boucle

    Donc remplace map_it par it ou inversement

    Pour le codage de la surcharge ça me semble correct

    Par contre pour le tri je ne me souviens pas qu'il existe de méthode sort() pour les maps, mais la méthode find compense le problème pour la recherche. En effet les maps sont rangées en arbre dichotomique afin d'accélérer la recherche donc voila

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Je te suggère plutôt de mettre un "typename" devant le nom de ton itérateur. C'est classique comme problème des compilateurs, ça permet de leur dire la chaîne de caractère qui suit est un type pas une variable.

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Ok merci pour vos éclaircissements, le problème semble résolu.

    - Effectivement, j'avais mal modifié mon code et oublié de transformer "map_it" en "it".
    - Avec un typename ça fonctionne tout de suite mieux.
    - J'ai par contre dû créér un const_iterator au lieu d'un iterator.

    voilà, je crois que c'est tout pour les modifications. Bref, merci pour tout !

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

Discussions similaires

  1. [STL] Question sur les MAP
    Par Goldstein00 dans le forum Langage
    Réponses: 1
    Dernier message: 22/05/2011, 13h49
  2. Question sur les Map-backed ActionForms
    Par RifDev dans le forum Struts 1
    Réponses: 2
    Dernier message: 23/09/2008, 18h46
  3. [Std::map] Question sur les clés
    Par Kreeg dans le forum SL & STL
    Réponses: 1
    Dernier message: 26/02/2008, 22h32
  4. Questions sur les Shadow Maps
    Par funkydata dans le forum DirectX
    Réponses: 4
    Dernier message: 25/10/2007, 13h58
  5. Question sur les specular maps
    Par funkydata dans le forum DirectX
    Réponses: 6
    Dernier message: 15/06/2006, 08h47

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