出现错误“必须调用对非静态成员函数的引用”

Getting an error of "Reference to non-static member function must be called"

提问人:Krishna Gaggar 提问时间:7/26/2023 最后编辑:Remy LebeauKrishna Gaggar 更新时间:7/26/2023 访问量:41

问:

我无法理解这个错误意味着什么,以及是什么导致了它。

这是我的代码,请帮我指出错误:

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 上搜索并找到了不同代码的解释,但我无法正确理解它。

C++ 错误处理 static-members 指针到成员

评论

0赞 Paul Sanders 7/26/2023
最简单的解决方法是创建一个自由函数,尽管您可以声明它并调整对 .sortbysecstaticstd::sort

答:

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);
});

或者正如评论所说,只需声明您的排序函数为静态即可。

此外,您的代码仍然不会使用此更改进行编译,因为其类型与返回类型不匹配vvector<pair<int,int>><vector<int>

评论

1赞 Remy Lebeau 7/26/2023
你不需要 lambda 内部,只要被捕获,编译器就会在解析时查看它。此外,在 C++14 及更高版本中,您可以使用以下命令简化 lambda:this->thissortbysecautosort(..., [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()thisstd::sort()

对错误最简单的修复方法是让 成为 ,因为它没有使用类的任何成员,例如:sortbysec()staticSolution

static bool sortbysec(const std::pair<int,int> &a, const std::pair<int,int> &b)

否则,您可以使用 std::bind() 创建一个将对象绑定到方法的函子,以便在不指定对象的情况下调用它,例如:Solutionsortbysec

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);
    }
);