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;
}
Partager