牛客OJ报错,已改仍旧存疑,求大佬指点

题目:把数组排成最小数
代码(已改,但仍旧存疑):
class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        string res = "";
        sort(numbers.begin(), numbers.end(), cmp); //cmp改为static之前,报错:调用了非静态函数,但不是通过类对象调用的
        for(int i = 0; i < numbers.size(); i++){
            res += to_string(numbers[i]);
        }
        return res;
    }
private:
    static bool cmp(int a, int b){ //改为static静态函数
        string sa = "";
        string sb = "";
        
        sa += to_string(a);
        sa += to_string(b);
        sb += to_string(b);
        sb += to_string(a);
        
        return sa < sb;
    }
};
报错:
sort(numbers.begin(), numbers.end(), cmp);
reference to non-static member function must be called.

百度了一下就搜到了
首先说明问题意思:这个问题是指你引用(调用)了非静态函数,但你不是通过类对象来调用的。问题的来源就是sort()函数的第三个谓词参数。为什么会是这样的呢?

按照常理来说,同一个类的非静态const成员函数中能相互调用,而不用通过类对象进行访问,为什么这里不行呢?相反如果我们把谓词函数com()定义为static函数问题就没有了。

问题的原因其实就是函数参数不匹配的问题。因为我们普通的成员函数都有一个隐含的this指针,表面上看我们的谓词函数com()只有两个参数,但实际上它有三个参数,而我们调用sort()排序函数的时候只需要用到两个参数进行比较,所以就出现了形参与实参不匹配的情况(函数有三个形参,但是只输入了两个实参)。

所以,解决办法就是把谓词函数com()定义为static成员函数。
————————————————
版权声明:本文为CSDN博主「赵同学」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_26849233/java/article/details/77930991
但不是很懂,为什么造成参数不匹配,为什么加上static就没问题了。
#21天打卡剑指offer#
全部评论
😂不用考虑0吗,我觉得应该需要吧
点赞 回复 分享
发布于 2020-04-23 11:18

相关推荐

码砖:求职岗位要突出,一眼就能看到,教育背景放到最后,学校经历没那么重要,项目要重点突出
点赞 评论 收藏
分享
07-14 13:37
重庆大学 C++
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务