Cela semble compiler et imprimer la bonne réponse (1):
#include <hash_map>
#include <utility>
#include <string>
#include <iostream>
typedef int CBTNODE;
typedef std::pair<std::string, unsigned int> INDEX;
typedef std::pair<int, CBTNODE> Element;
struct pairhash{
size_t operator()(const INDEX &p) const {
return
__gnu_cxx::hash<const char*>()(p.first.c_str())^
__gnu_cxx::hash<unsigned int>()(p.second);
}
};
int main() {
__gnu_cxx::hash_map<INDEX, Element, pairhash> x;
INDEX foo("hi", 0);
Element bar(1, 2);
x[foo] = bar;
std::cout << x[foo].first << "\n";
}
Ce qui était un peu fastidieux. Le problème est que __gnu_cxx::hash
ne fournit pas une spécialisation pour pair
, ou d'ailleurs pour string
soit. Je crois qu'il suit l'API SGI ici: http://www.sgi.com/tech/stl/hash.html. Donc pairhash
(ou quelque chose comme ça) est nécessaire pour fournir la fonction de hachage manquante.
Je ne vous blâme pas de ne pas avoir repéré cela, puisque l'erreur du compilateur que cela a causé était un peu, um, non évidente. Et longtemps.
Si vous le pouvez, vous êtes probablement mieux d'utiliser boost::unordered_map
. Le hash_map
de SGI est une ancienne API, jamais adoptée dans la norme, qui doit être remplacée en C++ 0x, etc., etc.