# cpp_mistake **Repository Path**: btg233/cpp_mistake ## Basic Information - **Project Name**: cpp_mistake - **Description**: 遇到的cpp报错情况,以linux平台为主 - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2023-04-14 - **Last Updated**: 2023-04-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # [reference1.cpp](https://gitee.com/btg233/cpp_mistake/blob/master/reference1.cpp) 定义了一个函数 foo,返回值是引用类型。main 函数使用普通变量接受引用,引发报错 ## 发生切片错误 由于 a 是一个非引用类型的变量,因此编译器将执行一个隐式的类型转换,将返回的 int& 类型转换为 int 类型。但是,这种类型转换实际上是通过切片 x 对象来实现的,仅复制了 x 的一部分数据到新的对象 a 中。 最终,程序将输出错误的结果,因为 a 包含的只是 x 的一部分数据,而不是完整的对象。 ![输入图片说明](picture/reference1.cpp.png) # [return1.cpp](https://gitee.com/btg233/cpp_mistake/blob/master/return1.cpp) ## 函数定义了返回类型,return没有返回值 ![输入图片说明](picture/return1.cpp.png) ## 没有return 此时编译器不会报错 # [variable1.cpp](https://gitee.com/btg233/cpp_mistake/blob/master/variable1.cpp) ## 定义的变量没有使用 只是编译警告,并没有任何错误。编译器认为可能存在代码逻辑错误或者不必要的性能开销。 ![输入图片说明](picture/variable1.cpp.png) # [endless_loop1.cpp](https://gitee.com/btg233/cpp_mistake/blob/master/endless_loop1.cpp) ## 逗号表达式优先级低于条件表达式 代码要求:编写一个 lambda,捕获一个局部 int 变量,并递减变量值,直至它变为0。一旦变量变为0,再调用 lambda 应该不再递减变量。lambda 应该返回一个 bool 值,指出捕获的变量是否为0 错误代码没有将逗号表达式括起来。条件表达式会直接与逗号表达式第二个操作数结合,使得 while 死循环 # [function1.cpp](https://gitee.com/btg233/cpp_mistake/blob/master/function1.cpp) ## 传递函数对象与调用函数 此代码为了计算有长度几个大于6的字符串。 这里报错很长很长,关注于最开始的报错。意思是类型不匹配 在许多 C++ 标准库算法(如 count_if、find_if 等)中,你需要提供一个谓词函数来对容器中的元素进行测试。你可以使用函数指针或函数对象来实现这个谓词函数。当你传递一个函数对象时,标准库会帮助你调用该对象,在不同容器元素上执行测试,因此你只需要传递函数对象本身,而不是调用它。 ![输入图片说明](picture/function1.cpp.png) # [bind1.cpp](https://gitee.com/btg233/cpp_mistake/blob/master/bind1.cpp) ## 占位符使用错误 在使用 bind 时,没有使用_1就直接使用 _2。编译器报错。 注意:编写代码时,写 _2 无 _1,编译器不会出现提醒,只有编译时报错 报错信息长的离谱,编译器会反馈bind本身出错,头文件出错等等。这里关注最下面的报错 ![输入图片说明](picture/bind1.cpp.png) # [bind2.cpp](https://gitee.com/btg233/cpp_mistake/blob/master/bind2.cpp) ## 占位符的测试 根据上一道代码 [bind1.cpp](https://gitee.com/btg233/cpp_mistake/blob/master/bind1.cpp),我们尝试只使用 _2 不使用 _1,在传参时传递两个参数 编译器可能发出警告,可能不发出。但是无论如何不会生成可执行文件 ![输入图片说明](picture/bind2.cpp.png) # [sort1.cpp](https://gitee.com/btg233/cpp_mistake/blob/master/sort1.cpp) ## 不接受常量迭代器 报错指出传递给 sort 的参数不匹配。sort 底层采用元素的复制或移动,不支持 cbegin,cend ![输入图片说明](picture/sort1.cpp.png) # [distance1.cpp](https://gitee.com/btg233/cpp_mistake/blob/master/distance1.cpp) ## 迭代器类型不匹配 必须 rcbegin 和 rcend,begin 和 end 等 ![输入图片说明](picture/distance1.cpp.png) # [map_add1.cpp](https://gitee.com/btg233/cpp_mistake/blob/master/map_add1.cpp) ## insert 传参出现问题 传给map.insert的参数要用{}括起来 这里的报错也是一堆,翻译过来是:使用 std::iterator_traits 时,参数类型不是一个迭代器类型,导致编译器无法推断出 value_type。 std::iterator_traits 是一个模板类,用于获取迭代器类型的属性,例如 value_type、iterator_category、difference_type 等。通常情况下,我们使用 std::iterator_traits 来获取迭代器类型的属性,而不是直接使用迭代器类型。 ![输入图片说明](picture/map_add1.cpp.png) # [explicit1.cpp](https://gitee.com/btg233/cpp_mistake/blob/master/explicit1.cpp) ## explicit的函数不支持隐式转化 这个程序坑人的地方在与,MyClass 类接受 int 参数,但是 doSomething 函数接受的是 MyClass 类,所以直接传递42给函数是错的。 第一种解决办法是去掉 explicit,第二种是显示的声明一个 MyClass 的对象,或是在函数参数列表内创建临时变量 ![输入图片说明](picture/explicit1.cpp.png) *谁要这么写,我一定打死他* # [class1.cpp](https://gitee.com/btg233/cpp_mistake/blob/master/class1.cpp) ## 类的成员函数调用问题 该类只有一个 prin 函数,在主函数中调用应使用局部的类的对象或者是隐式地使用一个对象 而该错误的报错,可能有两种。一种是编译器认为你的函数名写错了,另一种是不识别该函数。这两种归根到底就是没有正确的调用 ![输入图片说明](picture/class1.cpp.png)