A l'aide !! template hastable et iterateurs [Résolu]

A l'aide !! template hastable et iterateurs [Résolu] - C++ - Programmation

Marsh Posté le 02-07-2013 à 19:00:17    

Je vous laisse découvrir le problème dans le code ligne 19 et l'erreur plus bas !
 
 --- Toutes les ameliorations proposées plus bas ont été ajoutées dans ce code
 
 

Code :
  1. using namespace std;
  2. #include <tr1/unordered_map>
  3. #include <string>
  4. #include <iostream>
  5. template<class T>
  6. class ShellSort{
  7. string* sortedarray;
  8. int size;
  9. public :
  10. ShellSort( const tr1::unordered_map<string,T*>& mymap,     double (T::*ptr)() ){
  11.  size=mymap.size();
  12.  sortedarray = new string[size];
  13.  // Copy of all the keys in the array
  14.  int i = 0;
  15.  tr1::unordered_map<string,T>::iterator local_it = mymap.begin();
  16.  while(local_it != mymap.end()){
  17.   sortedarray[i]=local_it->first;
  18.   i++;
  19.   ++local_it;
  20.  }
  21.  // Sorting
  22.  int size = mymap.size();
  23.  for(int gap = size/2; gap!=0; gap/=2){
  24.   for(int index=gap; index<size; index++){
  25.    if((mymap[sortedarray[index]]->ptr)()<(mymap[sortedarray[index-gap]]->ptr)()){
  26.     string swap = sortedarray[index];
  27.     sortedarray[index] = sortedarray[index-gap];
  28.     sortedarray[index-gap] = swap;
  29.    }
  30.   }
  31.  }
  32. }
  33. ~ShellSort(){
  34.  delete[] sortedarray;
  35. }
  36. string GetElement(int i){
  37.  if(i>size){
  38.   cerr << "ShellSort::GetElement called with " << i << " when there is only " << size <<" elements\n";
  39.   exit(1);
  40.  }
  41.  return sortedarray[i];
  42. }
  43. };


 

$ g++ test.h
test.h: In constructor ‘ShellSort<T>::ShellSort(const std::tr1::unordered_map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, T*, std::tr1::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<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> >, T*> >, false>&, double (T::*)())’:
test.h:21: error: expected `;' before ‘local_it’
test.h:22: error: ‘local_it’ was not declared in this scope


Message édité par nastymushroom2 le 03-07-2013 à 00:01:33
Reply

Marsh Posté le 02-07-2013 à 19:00:17   

Reply

Marsh Posté le 02-07-2013 à 19:08:16    

ouch, la map passée par copie ...

 

Il te manque un ; à la fin de la ligne 18


Message édité par theshockwave le 02-07-2013 à 19:08:41

---------------
last.fm
Reply

Marsh Posté le 02-07-2013 à 19:13:21    

Là comme ça, il manque un ; à la ligne 18, ta fonction GetElement est supposée retourner un std::string&, et pas un pointeur, et ne vérifie pas que l'index est bon. D'ailleurs, celui-ci devrait être un size_t, non ? Pas d'index négatif.

 

Je pense qu'il vaut mieux faire passer mymap par référence constante, et pourquoi tu forces tes templates en pointeur ? tr1::unordered_map<std::string,T> suffirait amplement.

 

Aussi, vaut mieux utiliser un std::vector au lieu d'une alloc avec new/delete, plus safe.

 

edit :Ah, grilled :D


Message édité par Terminapor le 02-07-2013 à 19:17:13

---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 02-07-2013 à 19:57:35    

Merci pour ces conseils ... Je les ai appliqués mais ca ne résoud pas le fond du problème ... L'itérateur ne passe pas à la ligne 19 !

Reply

Marsh Posté le 03-07-2013 à 00:00:58    

c'est typename qui manquait ligne 19
 

Code :
  1. typename tr1::unordered_map<string,T*>::iterator local_it = mymap.begin();

Reply

Marsh Posté le 03-07-2013 à 01:20:32    

Ce qui m'étonne un peu là, c'est que le ::iterator passe sur une référence constante, c'est pas plutôt const_iterator :??:
 
Et le typename n'est pas supposé être obligatoire ici :heink:


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 03-07-2013 à 10:35:00    

Terminapor a écrit :

Ce qui m'étonne un peu là, c'est que le ::iterator passe sur une référence constante, c'est pas plutôt const_iterator :??:

 

Et le typename n'est pas supposé être obligatoire ici :heink:

 

Je ne sais plus dans quel était le code se trouvait quand je l'ai lu la première fois, mais je me suis fait la même remarque : typename ne devrait pas être obligatoire.
Dans la version que je vois maintenant, où on fait :

Code :
  1. template<class T>
  2. class ShellSort{
  3. // ...
  4.   tr1::unordered_map<string,T>::iterator local_it = mymap.begin();


Là, effectivement, il est requis de préciser typename pour gcc dans la mesure où, quand gcc parse la déclaration d'itérateur, il ne connait pas T et ne peut donc pas savoir quelle spécialisation éventuellement utiliser, donc le sens de ::iterator n'est pas évident.

 

Accessoiremnt, tu as tout à fait raison sur le const_iterator.


Message édité par theshockwave le 03-07-2013 à 10:35:19

---------------
last.fm
Reply

Marsh Posté le 03-07-2013 à 16:21:01    

Merci pour les précisions. :jap:


---------------
Perhaps you don't deserve to breathe
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed