Compilation de template... (débutant)

Compilation de template... (débutant) - C++ - Programmation

Marsh Posté le 06-03-2007 à 21:01:12    

Bonjour,
Je suis en train de développer une petite IA d'échecs en C++, et pour les besoins du programme, je veux utiliser une table de hachage, pour l'instant assez simple. Pour cela, comme std::map ne me convient pas (structure d'arbre binaire en interne), je me fait une petite classe template moi-même. Seulement j'ai une erreur à la compilation que je ne comprends pas...
 
Le code en question est :
 

Code :
  1. // Renvoie la valeur associée à la clé passée en paramètre
  2. template <typename Key, typename Value> bool hash_table<Key, Value>::find_key(Key k, Value &res)
  3. {
  4. unsigned int index = k % taille;
  5. std::list< std::pair<Key, Value> >::iterator it = vect[index].begin();
  6. while(it != vect[index].end())
  7. {
  8.  if(it->first == k)
  9.  {
  10.   res = it->second;
  11.   return true;
  12.  }
  13.  ++it;
  14. }
  15. return false;
  16. }


 
avec

Code :
  1. vector<list<pair<Key, Value> > > vect;

comme membre privé de la classe.
 
Le message renvoyé par g++ (4.1.2) à la compilation est :
 

hash_table.cpp: In member function ‘bool hash_table<Key, Value>::find_key(Key, Value& )’:
hash_table.cpp:31: error: expected `;' before ‘it’
hash_table.cpp:33: error: ‘it’ was not declared in this scope


 
Pouvez-vous m'éclairer sur ceci ?
Merci d'avance

Reply

Marsh Posté le 06-03-2007 à 21:01:12   

Reply

Marsh Posté le 06-03-2007 à 21:16:22    

Essaye
 

Code :
  1. typename std::list< std::pair<Key, Value> >::iterator it = vect[index].begin();

Reply

Marsh Posté le 06-03-2007 à 21:37:16    

Merci ça me vire mon erreur ! [:dawa]
La question maintenant c'est pourquoi...  :??:  
 
Par contre j'ai toujours une erreur, mais cette fois du linker...  
 

/tmp/ccakIuFz.o: In function `eval(Echiquier& )':
explore.cpp:(.text+0x2c7): référence indéfinie vers « hash_table<unsigned long long, int>::find_key(unsigned long long, int& )»
explore.cpp:(.text+0x1c97): référence indéfinie vers « hash_table<unsigned long long, int>::insert(unsigned long long, int)»
/tmp/ccH1ukRO.o: In function `__static_initialization_and_destruction_0(int, int)':
partie.cpp:(.text+0x81): référence indéfinie vers « hash_table<unsigned long long, int>::hash_table(unsigned int)»
collect2: ld returned 1 exit status


 
Alors que le constructeur est bien défini dans le fichier hash_table.cpp :
 

Code :
  1. template <typename Key, typename Value> hash_table<Key, Value>::hash_table(unsigned int size) : taille(size), vect(std::vector< std::pair<Key, Value> >(size))
  2. {
  3. return;
  4. }


 
Tout comme les autres fonctions membres, le fichier d'en-tête est inclu dans le fichier .cpp correspondant, et le fichier source est dans le même repertoire...
 
Je crois que le C++ c'est pas fait pour moi...

Reply

Marsh Posté le 06-03-2007 à 22:12:11    

les template se définissent uniquement dans les .h ...  
Lire les bases aideraient bien ;)
 
http://c.developpez.com/faq/cpp/?page=templates

Reply

Marsh Posté le 06-03-2007 à 22:14:38    

BJR, je suis a la recherche d'une personne qui connaitrais bien html  

Reply

Marsh Posté le 06-03-2007 à 22:15:01    

fashiongwen a écrit :

BJR, je suis a la recherche d'une personne qui connaitrais bien html


Le rapport avec la choucroute ?

Reply

Marsh Posté le 06-03-2007 à 22:15:31    

en quelques sorte

Reply

Marsh Posté le 06-03-2007 à 22:16:56    

j'ai commencé a faire mon site, et je voudrais  qu'on maide pour la section portfolio

Reply

Marsh Posté le 06-03-2007 à 22:21:06    

tu as vu le titre du topic ? on aprle d'HTML ? non. Donc poste un nouveau sujet :o

Reply

Marsh Posté le 06-03-2007 à 22:22:36    

Joel F a écrit :

les template se définissent uniquement dans les .h ...  
Lire les bases aideraient bien ;)
 
http://c.developpez.com/faq/cpp/?page=templates


Merci pour ces réponses, je pensais bêtement qu'il n'y avais pas raisons que ça change pour les classes templates... ;)

Reply

Marsh Posté le 06-03-2007 à 22:22:36   

Reply

Marsh Posté le 06-03-2007 à 23:33:22    

Joel F a écrit :

les template se définissent uniquement dans les .h ...


C'est simplifié. Les définitions des classes templates oui, uniquement. La définition de tout ce qui peut-être candidat à la résolution de surcharge (les fonctions quoi) n'est pas obligatoirement inclu dans un header.  

Reply

Marsh Posté le 07-03-2007 à 12:16:42    

++fab a écrit :

C'est simplifié. Les définitions des classes templates oui, uniquement. La définition de tout ce qui peut-être candidat à la résolution de surcharge (les fonctions quoi) n'est pas obligatoirement inclu dans un header.


 
tu es en train d eme dire que tu peut mettre le corps d'une fonction tempalte dans un .cpp o_O ?

Reply

Marsh Posté le 07-03-2007 à 19:34:28    

Joel F a écrit :

tu es en train de me dire que tu peux mettre le corps d'une fonction template dans un .cpp o_O ?


Oui.
 
Pronostic sur le diagnostic du compilateur sur la TU suivante ?
 

Code :
  1. template <class T>
  2. void f( T );
  3. void g()
  4. {
  5.     f( 2 );
  6. }


 
Voir §14.8.3.6, que je connais par coeur pour m'être déjà ridiculisé dessus :o

Reply

Marsh Posté le 07-03-2007 à 22:05:44    

nan mais t'as le droit d'instancier à la main, on dit pas.

Reply

Marsh Posté le 07-03-2007 à 22:37:53    

++fab a écrit :


Voir §14.8.3.6, que je connais par coeur pour m'être déjà ridiculisé dessus :o


 
Je note  :jap:  

Reply

Marsh Posté le 07-03-2007 à 22:43:01    

Citation :

nan mais t'as le droit d'instancier à la main, on dit pas.


à la main, ou pas. La norme dit que le code ci-dessus est légal si est présent dans le programme une instanciation de f<int>, qu'elle soit implicite ou explicite.
J'ai passé sous silence export, vu que le PO utilise GCC/g++.
Et j'espère que la tendance à mettre tout le code dans les headers va aller decrescendo.


Message édité par ++fab le 07-03-2007 à 22:44:12
Reply

Marsh Posté le 07-03-2007 à 23:51:59    

MiniMoi51 a écrit :

Bonjour,
Je suis en train de développer une petite IA d'échecs en C++, et pour les besoins du programme, je veux utiliser une table de hachage, pour l'instant assez simple.


A tout hasard, tu as à ta disposition std::tr1::unordered_map, qui est une table de hachage, utilisable sur ton compilateur.

Reply

Sujets relatifs:

Leave a Replay

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