龙空技术网

C++莫名问题解析,错误竟然只是小小const?C++经典错误解析

C语言基础 392

前言:

此时各位老铁们对“c语言error c2143”可能比较关心,姐妹们都需要学习一些“c语言error c2143”的相关内容。那么小编在网上汇集了一些有关“c语言error c2143””的相关内容,希望我们能喜欢,你们快快来了解一下吧!

前言

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

仿函数捆绑函数仿函数

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

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

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

捆绑函数bind1st 绑定左操作数 bind2nd 绑定右操作数

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

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

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

错误展示

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

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

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

报错如下:

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

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

尾言

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

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

《C++45课视频教程》

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

最后大家在学习C++泛型编程的时候有哪些有趣的错误呢?都可以在评论区留下足迹哦!

标签: #c语言error c2143 #c语言错误代码c2146怎么修改 #c语言错误c2143什么意思 #c语言c2146错误解决方法 #c语言c2146