C++报错‘Reference to non-static member function must be called’求助
关于“Reference to non-static member function must be called”错误的解析与修复
问题描述
编译时出现如下错误:
Line 19: Char 34: error: reference to non-static member function must be called sort(v.rbegin(),v.rend(),sortbysec); ^~~~~~~~~
对应的代码如下:
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; } };
错误原因
- 非静态成员函数
sortbysec属于类的实例对象,调用它必须依赖一个具体的Solution实例,而std::sort需要的是一个能直接调用的可调用对象(比如全局函数、静态成员函数、lambda等),没法直接传入非静态成员函数的地址。 - 你直接写
sortbysec时,编译器不知道该绑定到哪个Solution实例上,所以报错提示你必须通过实例来调用这个非静态成员函数。
修复方法
这里提供三种实用的修复方式:
方法一:把sortbysec改成静态成员函数
静态成员函数属于类本身,不依赖具体实例,可以直接传给std::sort:
class Solution { public: // 添加static关键字 static bool sortbysec(const pair<int,int> &a,const pair<int,int> &b) { return (a.second < b.second); } vector<int> topKFrequent(vector<int>& nums, int k) { unordered_map<int,int> m; for(int num : nums) { m[num]++; } vector<pair<int,int>> v; for(auto &pair : m) { v.push_back(pair); } sort(v.rbegin(),v.rend(),sortbysec); // 修复返回值类型不匹配问题 vector<int> res; for(int i=0;i<k;i++){ res.push_back(v[i].first); } return res; } };
方法二:用lambda表达式替代成员函数
直接在sort调用处写lambda,更简洁,不用额外定义成员函数:
class Solution { public: vector<int> topKFrequent(vector<int>& nums, int k) { unordered_map<int,int> m; for(int num : nums) { m[num]++; } vector<pair<int,int>> v; for(auto &pair : m) { v.push_back(pair); } sort(v.rbegin(),v.rend(),[](const pair<int,int> &a,const pair<int,int> &b) { return a.second < b.second; }); vector<int> res; for(int i=0;i<k;i++){ res.push_back(v[i].first); } return res; } };
方法三:用std::bind绑定当前实例
如果必须保留非静态成员函数,可以用std::bind把当前对象this绑定到函数上(需要包含<functional>头文件):
#include <functional> class Solution { public: bool sortbysec(const pair<int,int> &a,const pair<int,int> &b) { return (a.second < b.second); } vector<int> topKFrequent(vector<int>& nums, int k) { unordered_map<int,int> m; for(int num : nums) { m[num]++; } vector<pair<int,int>> v; for(auto &pair : m) { v.push_back(pair); } using namespace std::placeholders; sort(v.rbegin(),v.rend(),std::bind(&Solution::sortbysec, this, _1, _2)); vector<int> res; for(int i=0;i<k;i++){ res.push_back(v[i].first); } return res; } };
另外注意:原代码里topKFreAquent是拼写错误,应该改为topKFrequent;而且原函数声明返回vector<int>,但代码里直接返回vector<pair<int,int>>,这会导致编译错误,上面的修复代码已经一并修正了这个问题。
内容的提问来源于stack exchange,提问作者Krishna Gaggar
相关产品推荐
相关产品推荐

