C++的一些问题思考

baodream的笔记

目录

1.关于类中重载sort函数的报错问题

在类外重载sort函数的cmp直接定义即可,如下图:

typedef struct num{
            int num;
            int id;
}NUM;

bool cmp(NUM a,NUM b){
        return a.num<b.num;
}

class Solution {
public:
    void fun(){
        vector<NUM>v;
        sort(v.begin(),v.end(),cmp);
    }
};

int main(){
    Solution s;
    s.fun();
    return 0;
}

但是如果在类里面直接这样重载cmp函数会出现如下错误:
类中重载sort函数的报错问题(error: invalid use of non-static member function ‘bool Solution::cmp(int, int)’)
所以必须如下定义,加上static关键字:

class Solution {
public:
    typedef struct num{
            int num;
            int id;
    }NUM;

    static bool cmp(NUM a,NUM b){
        return a.num<b.num;
    }
    
    void fun(){
        vector<NUM>v;
        sort(v.begin(),v.end(),cmp);
    }
};

int main(){
    Solution s;
    s.fun();
    return 0;
}

在class类中的sort函数的参数cmp,定义时要声明为static,那么背后的原因是什么呢?
这是跟sort函数的定义有关系的,下面是sort函数的源码官方文档

template <class RandomAccessIterator, class Compare>
  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

可以知道其实我们写参数cmp时,是把函数名作为实参传递给了sort函数,而sort函数内部是用一个函数指针去调用这个cmp函数的(建议先看下 一文搞懂什么是 函数指针 ),我们知道class普通类成员函数cmp需要通过对象名.cmp()来调用,而sort()函数早就定义好了,那个时候哪知道你定义的是什么对象,所以内部是直接cmp()的,那你不加static时,去让sort()直接用cmp()当然会报错
static静态成员函数不用加对象名,就能直接访问函数(这也是静态成员函数的一大优点)所以加了static就不会报错

其他解决办法:用lambda或者内联函数inline博客连接
参考博客1博客2

2.未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值