У меня есть такой код. Я использую
pvalueholder - это полиморфный класс, он может содержать все виды типов, string..etc ..
Он также может иметь тип undefined.
typedef hash_map<pvalueholder,pvalueholder,pvaluehasher > hashtype;
hashtype h;
pvalueholder v;
v="c";
h[v]=5; // h has one element
pvalueholder v2=h[v]; // here h gets a new key/value how is that possible?
cout << (string) (h[v]) << endl; // here h gets another new key/value how is that possible?
int i =0;
for (hashtype::iterator h1=h.begin(); h1!=h.end();h1++)
{
cout << "no: " << i++ << endl;
} // this prints three lines, it should print one...
Здесь два значения не определены, третье - 5, как и ожидалось.
size_t pvaluehasher::operator() (const pvalueholder& p) const
{
cout << "hashvalue:" << p.value->hashvalue() << endl;
return p.value->hashvalue();
}
возвращает
Вот что напечатано:
значение хэш: 84696444
значение хэш: 84696444
значение хэш: 84696444
возвращает: 1
значение хэш: 84696444
возвращает: 1
значение хэш: 84696444
возвращает: 1
возвращает: 1
значение хэш: 84696444
У вас есть идеи, что это может быть?
Спасибо.
Решение:
Оператор функции () (параметр1, параметр2) должен быть другим в случае Microsoft STL.
Для Microsoft это должно вернуть меньше, чем отношение между параметром 1 и параметром 2.
Для gcc необходимо вернуть равенство. Я вернул равенство.
Функция сравнения для ключей была неправильной ...
Функция вернула true для равенства, в то время как должна возвращать меньше, чем в случае Microsoft STL.