需要标识符是什么错误_C++莫名问题解析,错误竟然只是小小const?C++经典错误解析...

前言

c3780aa3f29936c281a5e9f49bd580f9.png

最近讲STL算法篇的时候出了一个比较有意思的错误,在讲STL中的捆绑函数的时候出现了个莫名错误,使用库中的仿函数没有任何问题,使用自己写的仿函数进行捆绑调用的时候竟然出现莫名问题。今天在这里分享给大家,希望对大家有帮助哦。首先了解下以下前置知识:

  1. 仿函数
  2. 捆绑函数

仿函数

C++STL中很多算法都是结合仿函数使用的,仿函数主要担当的是排序准则和批量处理数据的功能。

仿函数:让类模仿的函数调用的方式去使用,我们以sort排序算法为例。有如下代码:

2adfd0e5a40ece8e2d2d0592e2170f00.png

库中排序准则就是所谓的仿函数,仿函数的其实只需要重载()运算符即可,less 是小于 做从小到大排序,greater 是大于做从大到小排序的,其实我们自己也可以实现这样的一个模板类,以及仿函数。如用自己写的仿函数替换库中的仿函数:

31e04bbbd79c561ecf8d2d717b03cf07.png

捆绑函数

  1. bind1st 绑定左操作数
  2. bind2nd 绑定右操作数

假设存在函数int sum(int i,int j) ,在使用捆绑函数的时候我们可以限定,i和j的值 ,通过捆绑函数实现

bind1st 限定的是i参数 bind2nd限定的是j参数,具体案例参照案例:

09e4e73fd52a8b13bac1cda8a9ed7f48.png

count_if :条件统计,greater中本来是a>b的的重载操作,bind2nd让b固定为4 故筛选为4的元素个数

错误展示

8851b00fdb8e653a722b316a91a1fb49.png

产生如下错误:(部分错误数据显示,完整有很多问题)

error C2039: “first_argument_type”: 不是“compareLess”的成员参见对正在编译的类 模板 实例化“std::binder2nd>”的引用 语法错误: 缺少“,”(在标识符“first_argument_type”的前面)“first_argument_type”: 未声明的标识符“result_type”: 不是“compareLess”的成员语法错误: 缺少“,”(在标识符“result_type”的前面)“result_type”: 未声明的标识符 “std::unary_function”: 模板 参数太多参见“std::unary_function”的声明error C2955: “std::unary_function”: 使用 类 模板 需要 模板 参数列表 参见“std::unary_function”的声明error C2146: 语法错误: 缺少“,”(在标识符“first_argument_type”的前面)1>d:softwarevcincludexfunctional(490): error C2065: “first_argument_type”: 未声明的标识符1>d:softwarevcincludexfunctional(491): error C2039: “result_type”: 不是“compareLess”的成员1>d:softwarevcincludexfunctional(491): error C2146: 语法错误: 缺少“,”(在标识符“result_type”的前面)1>d:softwarevcincludexfunctional(491): error C2065: “result_type”: 未声明的标识符1>d:softwarevcincludexfunctional(491): error C2977: “std::unary_function”: 模板 参数太多1>          d:softwarevcincludexstddef(126) : 参见“std::unary_function”的声明1>d:softwarevcincludexfunctional(492): error C2955: “std::unary_function”: 使用 类 模板 需要 模板 参数列表1>          d:softwarevcincludexstddef(126) : 参见“std::unary_function”的声明1>d:softwarevcincludexfunctional(493): error C2955: “std::unary_function”: 使用 类 模板 需要 模板 参数列表1>          d:softwarevcincludexstddef(126) : 参见“std::unary_function”的声明1>d:softwarevcincludexfunctional(495): error C2039: “second_argument_type”: 不是“compareLess”的成员1>d:softwarevcincludexfunctional(495): error C4430: 缺少类型说明符 - 假定为 int。注意:  C++ 不支持默认 int1>d:softwarevcincludexfunctional(495): error C2143: 语法错误 : 缺少“,”(在“&”的前面)1>d:softwarevcincludexfunctional(513): error C2039: “second_argument_type”: 不是“compareLess”的成员1>d:softwarevcincludexfunctional(513): error C2146: 语法错误: 缺少“;”(在标识符“value”的前面)1>d:softwarevcincludexfunctional(513): error C4430: 缺少类型说明符 - 假定为 int。注意:  C++ 不支持默认 int

然后用类去继承,依然会出现问题如下问题:

60da2f90915c8505cd62e0b5d487d643.png

报错如下:

error C3848: 具有类型“const compareLess”的表达式会丢失一些 const-volatile 限定符以调用“bool compareLess::operator ()(T,T)”

这个问题搞了10来分钟没搞定,最终的问题其实很出乎意料,通过观察 std::unary_function类发现问题只是因为缺少一个const修饰成员函数而出错。

577721a8a5b7a101203d7d2236439239.png

尾言

文章都是手打原创,每天最浅显的介绍C语言、C++,windows知识,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

《C语言51课视频教程合集》

《C++45课视频教程》

如果足下基础比较差,不妨关注下人人都可以学习的视频教程,通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值