提问人:Krishna Gaggar 提问时间:7/26/2023 最后编辑:Remy LebeauKrishna Gaggar 更新时间:7/26/2023 访问量:41
出现错误“必须调用对非静态成员函数的引用”
Getting an error of "Reference to non-static member function must be called"
问:
我无法理解这个错误意味着什么,以及是什么导致了它。
这是我的代码,请帮我指出错误:
class Solution {
public:
bool sortbysec(const pair<int,int> &a,const pair<int,int> &b)
{
return (a.second < b.second);
}
vector<int> topKFreAquent(vector<int>& nums, int k)
{
unordered_map<int,int> m;
for(int i=0;i<nums.size();i++)
{
m[nums[i]]++;
}
vector<pair<int,int>> v;
for(auto it = m.begin();it != m.end();it++)
{
v.push_back(make_pair(it->first,it->second));
}
sort(v.rbegin(),v.rend(),sortbysec);
v.resize(k);
return v;
}
};
我在通话中收到错误,确切的错误是:sort()
Line 19: Char 34: error: reference to non-static member function must be called
sort(v.rbegin(),v.rend(),sortbysec);
^~~~~~~~~
我在 StackOverflow 上搜索并找到了不同代码的解释,但我无法正确理解它。
答:
0赞
selbie
7/26/2023
#1
取而代之的是:
sort(v.rbegin(),v.rend(),sortbysec);
这:
sort(v.rbegin(), v.rend(), [this](const pair<int, int>& p1, const pair<int, int>& p2) {
return this->sortbysec(p1, p2);
});
或者正如评论所说,只需声明您的排序函数为静态即可。
此外,您的代码仍然不会使用此更改进行编译,因为其类型与返回类型不匹配v
vector<pair<int,int>>
<vector<int>
评论
1赞
Remy Lebeau
7/26/2023
你不需要 lambda 内部,只要被捕获,编译器就会在解析时查看它。此外,在 C++14 及更高版本中,您可以使用以下命令简化 lambda:this->
this
sortbysec
auto
sort(..., [this](const auto& p1, const auto& p2) { return sortbysec(p1, p2); });
0赞
selbie
7/26/2023
@RemyLebeau - 正确。我的意思是添加一条评论,明确是为了清楚起见。this->
2赞
Remy Lebeau
7/26/2023
#2
std::sort()
需要一个可比较的函数对象,它可以是自由函数、静态类方法、函子等。可以按原样调用的东西。
您正在尝试传入一个非静态类方法,该方法将不起作用,因为需要对象实例来调用它,因此有一个隐藏的参数,在调用该方法时无法传入该参数。sortbysec()
this
std::sort()
对错误最简单的修复方法是让 成为 ,因为它没有使用类的任何成员,例如:sortbysec()
static
Solution
static bool sortbysec(const std::pair<int,int> &a, const std::pair<int,int> &b)
否则,您可以使用 std::bind()
创建一个将对象绑定到方法的函子,以便在不指定对象的情况下调用它,例如:Solution
sortbysec
using namespace std::placeholders;
std::sort(v.rbegin(), v.rend(),
std::bind(&Solution::sortbysec, this, _1, _2)
);
或者,改用 lambda 来捕获 ,例如:this
std::sort(v.rbegin(), v.rend(),
[this](const std::pair<int,int> &a, const std::pair<int,int> &b){
return sortbysec(a, b);
}
);
在 C++14 及更高版本中,可以使用 简化一点,例如:auto
std::sort(v.rbegin(), v.rend(),
[this](const auto &a, const auto &b){
return sortbysec(a, b);
}
);
评论
sortbysec
static
std::sort