Это похоже на компиляцию и вывод правильного ответа (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";
}
Что было немного утомительно. Проблема в том, что __gnu_cxx::hash
не предоставляет специализацию для pair
, или, в этом отношении, для string
. Я полагаю, что здесь следует API SGI: http://www.sgi.com/tech/stl/hash.html. Таким образом, pairhash
(или что-то в этом роде) необходимо для предоставления недостающей хэш-функции.
Я не виню вас за то, что вы этого не заметили, поскольку вызванная этим ошибка компилятора была немного неочевидной. И долго.
Если вы можете, вам, вероятно, лучше использовать boost::unordered_map
. SGI hash_map
- это старый API, никогда не принятый в стандарт, который должен быть заменен на C ++ 0x и т. Д. И т. Д.