错误:reference to non-static member function must be called

问题:

今天刷牛客这道题的时候:

题目描述:

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

这是我的代码:

class Solution {
public:
    bool bijiao(int a, int b)
    {
        string sb = to_string(a)+to_string(b);
        string sa = to_string(b)+to_string(a);
        if(sb<sa)
            return true;
        else
            return false;
	}
        
    string PrintMinNumber(vector<int> numbers) {
        sort(numbers.begin(), numbers.end(), bijiao);   // 提示错误出在此处
        string s = "";
        for(int i=0; i<numbers.size(); ++i)
        {
            s += to_string(numbers[i]);
		}
        return s;
    }
};

错误提示为:

reference to non-static member function must be called: sort(numbers.begin(), numbers.end(), bijiao);

解决:

我们先看一下sort函数的定义:

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

参数comp的解释:

comp: Binary function that accepts two elements in the range as arguments, and returns a value
convertible to bool.The value returned indicates whether the element passed as first argument is
considered to go before the second in the specific strict weak ordering it defines.
The function shall not modify any of its arguments.
This can either be a function pointer or a function object.

在我写的这段代码中,sort(numbers.begin(), numbers.end(), bijiao)中第三个参数是一个函数指针,然而bijiao函数是一个非静态成员函数,非静态成员函数指针和普通函数指针是有区别的。具体区别,我们后文会讲到,然而静态成员函数指针和普通函数指针没有区别,所以此处将

bool bijiao(int a, int b);


改为

static bool bijiao(int a, int b); 


即可通过编译

或者将bijiao函数放在类外,改为全局普通函数亦可通过编译。 

接下来,我们解释成员函数指针和普通函数指针的不同:

我们知道bijiao成员函数拥有一个 implicit parameter

bool bijiao(Solution* this, int a, int b) 
所以,它和普通函数指针是有本质区别的,毕竟它们的参数列表都不相同。而静态成员函数没有this指针,这也就是静态成员函数指针和普通函数指针没有区别的原因。

脱离本问题,我们谈谈成员函数指针和普通函数指针的区别:

具体可参考这篇博客,讲的很好,侵删:

点击打开链接









  • 84
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 这个错误是因为在sort函数的第三个参数中引用了非静态成员函数,而在类定义中若不将成员函数声明为静态成员函数,会默认给成员函数添加一个this指针。而sort函数的第三个参数不允许有指针参数,所以会导致报错。解决这个问题的方法是将成员函数声明为静态成员函数,这样就不会添加this指针了。或者可以考虑将比较函数cmp定义为类外的普通函数,而不是成员函数。这样就可以解决该错误。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [[C++类静态成员函数]error: reference to non-static member function must be called](https://blog.csdn.net/qq_38337524/article/details/125084848)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [[Leetcode]错误:error: reference to non-static member function must be called](https://blog.csdn.net/weixin_46428351/article/details/123554510)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值