gpt4 book ai didi

c++ - 具有重载运算符的自定义类在用作映射键时会导致 C2678

转载 作者:行者123 更新时间:2023-11-28 00:35:26 26 4
gpt4 key购买 nike

我这里有一些奇怪的东西。

我写了一个自定义类 HashedString:

class HashedString {
protected:
std::string str;
long hash;

public:
HashedString(std::string str);
~HashedString();

std::string GetString();
long GetHash();

bool operator== ( HashedString & o ) {
return this->hash == o.GetHash();
}
bool operator<= ( HashedString & o ) {
return this->hash <= o.GetHash();
}
bool operator>= ( HashedString & o ) {
return this->hash >= o.GetHash();
}
bool operator< ( HashedString& o ) {
return hash < o.GetHash();
}
bool operator> ( HashedString & o ) {
return this->hash > o.GetHash();
}
bool operator!= ( HashedString & o ) {
return this->hash != o.GetHash();
}
std::ostream& operator<<(std::ostream& lhs) {
return lhs << "{" << hash << ": " << str << "}";
}
};


std::map<HashedString, Resource> resources;

当像上面那样在 map 中使用它作为键时,出现以下错误:

二元运算符“<”:未定义采用“const HashedString”类型的左侧操作数的运算符(或者没有可接受的转换)

我无法让它工作,而且我不明白为什么这段代码会被编译器拒绝。

有谁知道解决方案和我在这里犯的错误吗?

谢谢,谢诺

最佳答案

你需要让你的运算符(operator)const .它还应该使用 const引用:

bool operator< (const HashedString& o ) const { .... }

或者,您可以将其设为非成员运算符:

bool operator<(const HashedString& lhs, const HashedString& rhs)
{
lhs.GetHash() < rhs.GetHash();
}

这将是首选选项,因为它对于两个操作数都是对称的。

请注意,比较运算符改变其任一操作数是没有意义的。这适用于您所有的比较运算符。

最后,为了让它工作,你必须制作 GetHash() const也是:

long GetHash() const;

编辑:我之前没有深入探讨这个问题,但很明显这种机制对于散列冲突很脆弱。除非你在你的键值范围内有完美的散列,否则你最好使用 std::unordered_map<std::string> .

关于c++ - 具有重载运算符的自定义类在用作映射键时会导致 C2678,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21123472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com