我试图使用std :: max_element来查找已定义结构的std :: forward_list中的最大元素。以下是代码:
//.h file:
#include <unordered_map>
#include <forward_list>
// my structure:
struct A
{
uint8_t length;
bool reverseMatch;
bool operator<(const A& rhs);
A() : length(0), reverseMatch(false) {}
};
using Alias = std::unordered_map<uint32_t, std::forward_list<A>>;
class B
{
Alias data;
public:
parse(string inputFilename);
A getBestMatch(uint32_t lineNumber);
};
麻烦的功能:
//.cpp file
#include <sstream>
#include <algorithm>
#include <string>
#include "file.h"
bool A::operator<(const A& rhs)
{
return (this->length < rhs.length);
}
A B::getBestMatch(uint32_t lineNumber)
{
A ret;
auto dataIter = this->data.find(lineNumber);
if (dataIter != data.end())
{
ret = *(std::max_element(dataIter->second.begin(), dataIter->second.end()));//!!!ERROR!!!
}
return ret;
}
我得到的错误是&#34;二进制表达式的操作数无效(&#39; const A&#39;和&#39; const A&#39;)&#34;。我不确定为什么我的运营商&lt;超载在这里有问题。我还需要定义其他操作数吗?如果是这样,为什么?我读过的所有文档都指出std :: max_element使用&lt;运营商。谢谢!
答案 0 :(得分:0)
已更改为
bool operator<(const A& rhs) const;
答案 1 :(得分:0)
问题是你的operator<
是非常量的,但更好的是使它成为非成员,这会产生使左右参数保持一致的副作用:
bool operator<(const A& lhs, const A& rhs)
{
return (lhs.length < rhs.length);
}
您可以在课堂外的标题中声明它,如下所示:
bool operator<(const A& lhs, const A& rhs);
有些人(包括我自己)喜欢在不需要私人访问权限的情况下将这些功能保留在课堂之外。