C ++无效运算符<使用排序时

Posted

技术标签:

【中文标题】C ++无效运算符<使用排序时【英文标题】:C++ invalid operator< when using sorting 【发布时间】:2015-02-11 01:28:03 【问题描述】:
bool sortingGame(Player Player1, Player Player2)

    if (Player1.gamePercent() > Player2.gamePercent())// first compare precetage (float)
    
        return true;
    
    else if (Player2.gamePercent() > Player1.gamePercent())
    
        return false;
    
    else if (Player1.getLastName() > Player2.getLastName())//then names (std::string)
    
        return true;
    
    else if (Player2.getLastName() > Player1.getLastName())
    
        return false;
    
    else if (Player1.getFirstName() > Player2.getFirstName())
    
        return true;
    
    else
    
        return false;
    

在 main() 中:

sort(Players.begin(), Players.end(), sortGame);

这是在 Visual Studio 中调试时显示的错误。

Program:C:\.....\include\algorithm
Line:3014
Expression: invalid operator<

【问题讨论】:

3014 到底是哪一行? 不确定...在#include @pinesfrst Visual Studio 错误可能是由于您的operator &lt; 不一致而出现的,即a &lt; b 但同时b &lt; a。当然这是一种荒谬的情况,但是 Visual Studio 的调试运行时会针对这种错误情况进行测试,可能您的代码没有通过测试。 此外,您应该通过const reference 将对象传递给函数,而不是通过值。 要获得明确的答案,请发帖MCVE 【参考方案1】:

当我模拟一个玩家类并运行您的代码时,它运行良好。错误必须属于其他地方。

但是,通过检查相等性并返回比较结果,您的代码可以大大收紧:

bool sortingGame(Player Player1, Player Player2)

    if (Player1.gamePercent() != Player2.gamePercent())// first compare precetage (float)
    
        return Player1.gamePercent() > Player2.gamePercent();
    
    else if (Player1.getLastName() != Player2.getLastName())
    
        return Player1.getLastName() > Player2.getLastName();
    
    else
    
        return Player1.getFirstName() > Player2.getFirstName();
    


还要考虑字符串通常以反向排序顺序(字母顺序)列出。因此小于运算符(

bool sortingGame(Player Player1, Player Player2)

    if (Player1.gamePercent() != Player2.gamePercent())// first compare precetage (float)
    
        return Player1.gamePercent() > Player2.gamePercent();
    
    else if (Player1.getLastName() != Player2.getLastName())
    
        return Player1.getLastName() < Player2.getLastName();
    
    else
    
        return Player1.getFirstName() < Player2.getFirstName();
    


【讨论】:

以上是关于C ++无效运算符<使用排序时的主要内容,如果未能解决你的问题,请参考以下文章

g++ 错误:无效使用范围运算符 (::)

在 MLCP 中作为 -query_filter 传递时,值运算符“<”(小于)符号无效

在 C++ 中重载比较运算符会导致“无效运算符<”

C语言socket编程中setsockopt设置超时时间对read无效

在 C++ 三元运算符中使用字符串常量是对非左值数组的无效使用吗?

不完整类型 'class std::future<int> 的无效使用