尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数

Attemptimg to use a predicate function causes the error: 'std::sort' no matching overloaded function found

本文关键字:函数 sort 重载 std 谓词 错误      更新时间:2023-10-16

我正在尝试将std::sort()算法与自定义谓词一起使用,但遇到编译器错误。我正在使用带有C++17和v142工具集的Visual Studio 2019。

我正在从Microsoft文档示例中复制确切的代码。代码如下:

谓词函数:

bool UDgreater ( int elem1, int elem2 )
{
return elem1 > elem2;
}

主要:

for (int i = 0; i < 5; i++) {
v1.push_back(2 * i + 1);
}
std::sort( v1.begin( ), v1.end( ), UDgreater );

错误:

std::sort()行遇到谓词函数本身的错误:

">

UDgreater"非标准语法;使用"&"创建指向成员的指针

我的测试项目中除了包含<algorithm><vector>之外,不存在其他代码。

有什么办法解决这个问题吗?

更改 UDgreat,如下所示:

struct {
bool operator()(int a, int b) const
{   
return a > b;
}   
} UDgreater;

错误消息告诉我们,您的UDgreater()不是一个独立的函数,而是一个非静态类方法(您没有提到的重要细节(。

作为非静态类方法,它不能直接用作标准算法的谓词。 您必须使用函子(C++11 之前(或 lambda(C++11 及更高版本(包装它,例如:

// using a functor...
struct UDgreaterFunctor
{
YourClassType &myClass;
UDgreaterFunctor(YourClassType &aMyClass) : myClass(aMyClass) {}
bool operator()(int elem1, int elem2) const {
return myClass.UDgreater(elem1, elem2);
}
};
std::sort( v1.begin(), v1.end(), UDgreaterFunctor(*this) );
// using a lambda...
std::sort( v1.begin(), v1.end(),
[this](int elem1, int elem2){
return this->UDgreater(elem1, elem2);
}
);