ошибка квалификатора типа при хешировании определенного пользователем объекта

В настоящее время у меня есть определенный пользователем класс с именем ResultTableEntry, и я хотел бы иметь возможность создать std :: unordered_set. Я обнаружил, что для моего класса будет создана хеш-функция, чтобы я мог инициализировать набор.

#include <vector>
#include <string>

class ResultTableEntry {
private:
int relIndex;
std::vector<int> paramIndex;
std::vector<std::string> result;

public:
ResultTableEntry::ResultTableEntry(int, std::vector<int>, std::vector<std::string>);

int getRelationshipIndex();
std::vector<int> getParameterIndex();
std::vector<std::string> getResult();
};

namespace std {

template <>
struct hash<ResultTableEntry>
{
std::size_t operator()(const ResultTableEntry& k) const
{

size_t res = 17;
for (auto p : k.getParameterIndex()) {
res = res * 31 + hash<int>()(p);
}
for (auto r : k.getResult()) {
res = res * 31 + hash<std::string>()(r);
}
res = res * 31 + hash<int>()(k.getRelationshipIndex());
return res;
}
};
}

Я реализовал свою хэш-функцию в соответствии с: C ++ unordered_map с использованием пользовательского типа класса в качестве ключа

Однако я продолжал сталкиваться с этими ошибками.

  • объект имеет спецификаторы типа, которые не совместимы с функцией-членом «ResultTableEntry :: getParameterIndex»
  • объект имеет спецификаторы типа, которые не совместимы с функцией-членом «ResultTableEntry :: getResult»
  • объект имеет спецификаторы типа, которые не совместимы с функцией-членом «ResultTableEntry :: getRelationshipIndex»
  • выражение, имеющее тип ‘const std :: hash’, потеряло бы некоторые const-volatile квалификаторы для вызова size_t std :: hash :: operator () (ResultTableEntry &)»

Удаление const в параметре, похоже, тоже не помогает. Что-то не так с моей реализацией? Я не смогу использовать другую библиотеку, такую ​​как boost.

0

Решение

Вы должны заверить компилятор, что функции-члены не будут изменять указатель * this

#include <vector>
#include <string>

class ResultTableEntry {
private:
int relIndex;
std::vector<int> paramIndex;
std::vector<std::string> result;

public:
ResultTableEntry(int, std::vector<int>, std::vector<std::string>);

int getRelationshipIndex() const;
std::vector<int> getParameterIndex() const;
std::vector<std::string> getResult() const;
};

namespace std {

template <>
struct hash<ResultTableEntry>
{
std::size_t operator()(const ResultTableEntry& k) const
{
size_t res = 17;
for (auto p : k.getParameterIndex()) {
res = res * 31 + hash<int>()(p);
}
for (auto r : k.getResult()) {
res = res * 31 + hash<std::string>()(r);
}
res = res * 31 + hash<int>()(k.getRelationshipIndex());
return res;
}
};
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]