C ++ - 散列用户定义对象时的类型限定符错误

时间:2018-02-27 02:11:30

标签: c++ object hash operator-overloading user-defined-types

我目前有一个名为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 using a custom class type as the key

实现了我的哈希函数

但是,我一直面临这些错误。

  • 该对象具有与成员函数“ResultTableEntry :: getParameterIndex”不兼容的类型限定符
  • 该对象具有与成员函数“ResultTableEntry :: getResult”不兼容的类型限定符
  • 该对象具有与成员函数“ResultTableEntry :: getRelationshipIndex”不兼容的类型限定符
  • 具有'const std :: hash'类型的
  • 表达式会丢失一些const-volatile限定符,以便调用'size_t std :: hash :: operator()(ResultTableEntry&amp;)'

在参数中删除'const'似乎也没有帮助。我的实施有问题吗?我将无法使用像boost这样的其他库。

1 个答案:

答案 0 :(得分: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;
        }
    };
}