我有一个在Linux上运行的C ++代码但我在Windows上遇到了Visual C ++的错误。代码如下:
struct dependence {
dependence() {}
dependence(string CUid, LID sink, LID source, std::string var)
: CUid(CUid), sink(sink), source(source), var(var) {}
string CUid;
LID sink = 0;
LID source = 0;
std::string var;
};
struct dependenceCompare {
bool operator() (const dependence& lhs, const dependence& rhs) const{
return ((lhs.CUid<rhs.CUid) || (lhs.source<rhs.source) || (lhs.sink < rhs.sink) || (lhs.var < rhs.var));
}
};
在Windows上运行代码时出现以下错误:
Debug Assertion Failed!“c:\ windows \ system32 \ MSCP120D.dll c:\ Program Files \ Microsoft Visual Studio 12.0 \ VC \ include \ xtree line 1795 Expression:invalid operator&lt; 当我将比较器更改为只有一个if子句时,它可以工作:
struct dependenceCompare {
bool operator() (const dependence& lhs, const dependence& rhs) const{
return ((lhs.CUid < rhs.CUid));
}
};
我已经阅读了这个帖子,但是无法找到问题所在以及为什么它在Linux中使用 cmake 而不是在Visual Studio C ++中工作。
答案 0 :(得分:6)
a.i < b.i || a.j < b.j
之类的东西不是严格的弱排序&#34;根据{{1}}之类的要求,因为它意味着给定两个项目,每个项目可以比另一个项目少。
看到这种形式的多场比较很常见:
std::map
这可能更像你想要的:给一个领域优先,但使用另一个领域打破关系。
您可以使用std::tie
if(a.i != b.i) return a.i < b.i;
if(a.j != b.j) return a.j < b.j;
return a.k < b.k;
对于您的代码,它将是:
return (std::tie(a.i, a.j, a.k) < std::tie(b.i, b.j, b.k));