You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:27:47