C ++ / priority_queue /表达式:无效的比较器

问题描述

编辑 我提供了带有重新编写的代码的编译错误的屏幕截图。 compile error screenshot

原始帖子 我正在编写一个小程序来练习对priority_queue容器的了解。我正在尝试创建一个优先级队列,以接受具有年龄和性别的Person对象。队列应该优先考虑老年,然后女性优先于男性(即,女性优先于年轻女性,女性优先于男性)。我写了一个应该处理优先级的谓词,但是当我尝试编译下面的代码片段时,我得到了一个Expression:无效的比较器错误。谁能解释我的谓词有什么问题?

#include <stack>
#include <queue>
#include <list>
#include <vector>
#include <iostream>

class Person
{
public: 
    int age;
    bool isFemale; 

    Person(int Age,bool Female)
    {
        age = Age;
        isFemale = Female; 
    }

    bool operator < (const Person& compareHuman) const
    {
        bool bRet = false;

        if (age < compareHuman.age)
            bRet = true;

        if (isFemale && compareHuman.isFemale)
            bRet = true;

        return bRet;    
    }
};

int main()
{
    std::priority_queue<Person,std::vector<Person>> humanStack;
    humanStack.push(Person(15,true));
    humanStack.push(Person(42,true));
    humanStack.push(Person(76,true));
    humanStack.push(Person(65,false));
    humanStack.push(Person(21,false));
    humanStack.push(Person(35,true));
    humanStack.push(Person(15,false));

    while(humanStack.size() != 0)
    {
            std::cout << "This person is age " << humanStack.top().age << std::endl;
            humanStack.pop(); 
    }
}

解决方法

问题是您的谓词少于您的谓词未正确实施。如所写,如果isFemale为真,则值将小于自身。一个值绝不能与一个有效谓词相比较。您可能想要这样的东西:

bool operator < (const Person& compareHuman) const
{
    if (age < compareHuman.age)
        return true;
    else if (compareHuman.age < age)
        return false;

    // Note the ! added on this line
    return isFemale && !compareHuman.isFemale;
}
,

您的代码使用C ++ 11为我编译而没有错误。 (c声)。

在c ++ 03中,编译器抱怨button.config["text" = "X"]-要解决此问题,请在两个尖括号之间插入一个空格,例如:vector<Person>> humanStack