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

SL & STL C++ Discussion :

redéfinition d'opérateur STL


Sujet :

SL & STL C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 8
    Points : 8
    Points
    8
    Par défaut redéfinition d'opérateur STL
    Bonjour à tous..
    J'ai un problème avec un travail scolaire. J'ai écris un programme qui utilise une file de priorite à la facon d'un spooler. Tout semble fonctionner mais j'ai ces erreurs à la compilation:

    /usr/lib/gcc/i586-mandriva-linux-gnu/4.2.2/../../../../include/c++/4.2.2/bits/stl_function.h: In member function ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Tache]’:
    /usr/lib/gcc/i586-mandriva-linux-gnu/4.2.2/../../../../include/c++/4.2.2/bits/stl_heap.h:279: instantiated from ‘void std::__adjust_heap(_RandomAccessIterator, _Distance, _Distance, _Tp, _Compare) [with _RandomAccessIterator = std::_Deque_iterator<Tache, Tache&, Tache*>, _Distance = int, _Tp = Tache, _Compare = std::less<Tache>]’
    /usr/lib/gcc/i586-mandriva-linux-gnu/4.2.2/../../../../include/c++/4.2.2/bits/stl_heap.h:404: instantiated from ‘void std::make_heap(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = std::_Deque_iterator<Tache, Tache&, Tache*>, _Compare = std::less<Tache>]’
    /usr/lib/gcc/i586-mandriva-linux-gnu/4.2.2/../../../../include/c++/4.2.2/bits/stl_queue.h:353: instantiated from ‘std::priority_queue<_Tp, _Sequence, _Compare>::priority_queue(const _Compare&, const _Sequence&) [with _Tp = Tache, _Sequence = std::deque<Tache, std::allocator<Tache> >, _Compare = std::less<Tache>]’
    ../main.cpp:81: instantiated from here
    /usr/lib/gcc/i586-mandriva-linux-gnu/4.2.2/../../../../include/c++/4.2.2/bits/stl_function.h:227: erreur: no match for ‘operator<’ in ‘__x < __y’
    ../main.cpp:62: note: candidats sont: bool operator<(Tache&, Tache&)
    make: *** [main.o] Erreur 1

    Il semblerait que la redéfinition des opérateurs ne fonctionne pas et ni moi ni mon professeur ne trouvons pourquoi..

    Si ca vous tente de défier un prof du cegep vous êtes les bienvenus

    voici mon code:


    #include <iostream>
    #include <queue>
    #include <functional>

    using namespace std;

    class Tache{

    public:

    Tache(void) { nom = "sans nom", priorite = 1 ; }

    Tache( string leNom, int laPriorite ){
    if(setNom(leNom)){
    if(setPriorite(laPriorite))
    else setPriorite(1);
    }
    else setNom("sans nom");
    }


    bool setNom( string nom ){return(nom.size()>0);}

    bool setPriorite(int prio){return (prio<5 && prio>0);}

    string getNom(){return nom;}

    int getPriorite(){return priorite;} const

    ~Tache(){}

    private:
    string nom;

    int priorite;


    };

    bool operator<( Tache & tache1, Tache & tache2 ){
    return tache1.getPriorite() < tache2.getPriorite() ;
    }

    bool operator==(Tache & tache1, Tache & tache2 ){
    return tache1.getPriorite() == tache2.getPriorite() ;
    }

    bool operator>( Tache & tache1, Tache & tache2 ){
    return tache1.getPriorite() > tache2.getPriorite() ;
    }

    int main( ){

    /** var: char Option, Choix de l'utilisateur */
    char option;
    /** var: string optionSaisie, le string lu lors de la saisie du choix*/
    string optionSaisie;

    priority_queue< Tache, deque<Tache>, less<Tache> > spool ;

    bool stop = false;



    cout << "Lancement de l'application ..." << endl;

    do
    {
    // Le menu
    cout << endl;
    cout << "----------------------------------------" << endl;
    cout << " a => Ajouter une tache d'impression." << endl;
    cout << " e => Enlever une tache d'impression." << endl;
    cout << " i => Imprimer le prochain élément." << endl;
    cout << " f => Afficher le contenu de la file d'impression" << endl;
    cout << " s => Suspendre l'impression." << endl;
    cout << " r => Reprendre l'impression." << endl;
    cout << " q => Quitter." << endl;
    cout << "------------------------------------------" <<endl;
    do
    {
    cout << "Choix: " << endl ;
    getline(cin, optionSaisie);
    if(optionSaisie.size()== 0 ) // si vide reprendre la saisie
    continue ;
    option=optionSaisie.at(0); // le premier caractere de la chaine lue



    }while (((string) "aeifsrq").find(option) == string::npos);

    // Aussi longtemps que le caractere choisi n'est pas trouve dans les
    // caracteres valides
    cout << endl;


    switch (option)
    {
    //menu test du tableau indice
    case 'a':
    {
    string nom;
    string priorite;
    int prio;
    int taille = spool.size() ;
    int cnt = 1 ;
    bool ok = true;
    Tache val;
    priority_queue< Tache, deque<Tache> > temp ;

    cout<<"quel est le nom de la tache a ajouter?"<<endl;
    getline(cin,nom);

    while( cnt <= taille ){
    val = spool.top() ;
    if(val.getNom() != nom){
    spool.pop() ;
    temp.push(val) ;
    cnt++ ;
    }
    else ok = false;
    }
    while(cnt>=1){
    spool.push(temp.top());
    temp.pop();
    cnt--;
    }
    if(ok){
    cout<<"Quel est la priorite de la tache (1-4)"<<endl;
    getline(cin,priorite);
    prio = (int)priorite[0]-48;

    if(prio > 0 && prio < 5){
    spool.push(Tache(nom,prio));
    cout<<"Tache insere correctement"<<endl;
    }
    else
    cout<<"priorite invalide, veuillez essayer de nouveau"<<endl;

    }
    else{
    cout<<"Impossible d'utiliser ce nom, soit la file est pleine,"<<endl;
    cout<<"soit le nom existe deja"<<endl;
    }
    }
    break;

    //menu test du tableau de pointeurs
    case 'e':
    {
    Tache val;
    int taille = spool.size() ;
    int cnt = 1 ;
    bool ok = false;
    string nom;
    priority_queue<Tache, deque<Tache> > temp ;

    cout<<"Quel est le nom de la tache que vous voulez enlever?"<<endl;
    getline(cin,nom);

    while(cnt <= taille){
    val = spool.top() ;
    if(val.getNom() != nom){
    spool.pop() ;
    temp.push(val) ;
    cnt++ ;
    }
    else{
    spool.pop();
    cout<<"La tache a ete enleve correctement"<<endl;
    ok = true;
    }
    }
    while(cnt>=1){
    spool.push(temp.top());
    temp.pop();
    cnt--;
    }
    if(!ok)
    cout<<"La tache n'existe pas, veuillez essayer de nouveau"<<endl;
    }
    break;

    // Menu comparer deux chaines
    case 'i':{
    if(stop = false){
    if(spool.size()>0 ){
    Tache val;
    val = spool.top();
    cout<<"impression de "<<val.getNom()<<" "<<val.getPriorite()<<endl;
    spool.pop();
    }
    else cout<< "La file d'impression est vide"<<endl;
    }
    else cout<<"Impossible d'imprimer en ce moment"<<endl;
    }
    break;

    // Menu phrases alléatoires
    case 'f':{
    Tache val;
    int taille = spool.size() ;
    int cnt = 1 ;
    priority_queue< Tache, deque<Tache> > temp ;

    while( cnt <= taille ){
    val = spool.top() ;
    cout<<val.getNom()<<" "<<val.getPriorite()<<endl;
    spool.pop() ;
    temp.push(val) ;
    cnt++ ;
    }
    while(cnt>=1){
    spool.push(temp.top());
    temp.pop();
    cnt--;
    }
    }
    break;

    case 's':{
    stop = true;
    }
    break;

    case 'r':{
    stop = true;
    }
    break;

    // Menu Quitter
    case 'q':
    cout << "Arret du programme..." << endl;
    break;

    }

    }while (option != 'q');


    return 0;
    }

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    note: candidats sont: bool operator<(Tache&, Tache&)
    Tout est ici. Redéfinis le prototype ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     bool operator < (Tache, Tache)

    N'oublie pas les balises [ CODE ] [ /CODE ].

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 8
    Points : 8
    Points
    8
    Par défaut effectivement ca fonctionne
    maintenant j'aimerais bien comprendre pourquoi lorsque je passait les taches avec & cela ne fonctionnait pas??

    une petite explication serait la bienvenue car d'autres élèves y sont arrivés avec les redéfinitions comme je les avais écrites pourquoi moi ca ne fonctionnait pas???

    merci d'avance


    p.s.Je ne suis pas très familier avec les forums...excusez-moi pour l'oublie des [code]

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Oui, je ne comprenais pas aussi...

    En fait, ta fonction getPriority () n'est pas constante.
    Ce sera mieux ainsi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     int getPriorite() const {return priorite;}
    et ta fonction de comparaison ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    bool operator < (const Tache & tache1, const Tache & tache2) {
      return tache1.getPriorite() < tache2.getPriorite() ;
    }
    Voilà, c'est plus logique.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 8
    Points : 8
    Points
    8
    Par défaut aoyou tu es un chef
    Merci beaucoup de t'être penché sur mon problème...grâce a toi je vais dormir plus tranquille.

    Merci encore

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

Discussions similaires

  1. Redéfinition d'opérateur & pointeurs
    Par Neckara dans le forum C++
    Réponses: 11
    Dernier message: 22/10/2012, 11h17
  2. Réponses: 10
    Dernier message: 17/12/2007, 10h13
  3. Erreur de lien : redéfinition d'opérateurs
    Par poukill dans le forum C++
    Réponses: 3
    Dernier message: 02/07/2007, 15h44
  4. redéfinition des opérateurs en C++
    Par apan dans le forum C++
    Réponses: 11
    Dernier message: 27/03/2006, 15h58
  5. Redéfinition / Surdéfinition d'opérateur
    Par slate dans le forum C++
    Réponses: 12
    Dernier message: 17/02/2006, 02h17

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