9

我有一个类指针向量std::vector<Square*> listSquares。我想用类的属性之一作为键对其进行排序。这就是我正在做的

bool compById(Square* a, Square* b)
{
    return a->getId() < b->getId();
}

std::sort(listSquares.begin(), listSquares.end(), compById)

但编译器说:错误:没有匹配函数调用'sort(std :: vector :: iterator,std :: vector :: iterator,<未解决的重载函数类型>)'

我在这里做错了什么?

4

3 回答 3

13

为了compById用作参数,std::sort它不应该是成员函数。这是错误的

class Square
{
    bool compById(Square* a, Square* b)
    {
        return a->getId() < b->getId();
    }
    ...
};

这个更好,

class Square
{
    ...
};

bool compById(Square* a, Square* b)
{
    return a->getId() < b->getId();
}
于 2013-05-03T20:43:25.780 回答
3

您缺少的最重要的部分是 compare 函数的参数是const. 另一个是返回类型。如果在声明函数时省略了返回类型,编译器将假定它返回int,这在这种情况下是不正确的。

当然,当您调用该std::sort函数时,比较函数必须在范围内。

于 2013-05-03T20:26:20.087 回答
2

您可以使用成员函数。但是您需要将其定义为静态成员函数并从类中调用它,而不是从类的实例中调用。

注意static函数声明Square::之前和排序中的函数名之前。

class Square
{
    /*...*/
public:
    static bool compById(const Square* a, const Square* b)
    {
        return a->getId() < b->getId();
    }
};

main()
{
    /*...*/
    std::sort(listSquares.begin(), listSquares.end(), Square::compById);
}
于 2017-12-30T10:04:58.717 回答