开发必看!C++常见错误合集和解决方法

1、临时变量的非const引用
编译报错:Line 11: Char 34: error: cannot bind non-const lvalue reference of type ‘ std::__cxx11::string& ’ {aka ‘ std::__cxx11::basic_string< char> & ’ } to an rvalue of type ‘ std::__cxx11::basic_string< char> ’
这个错误是C++编译器的一个关于语义的限制。
如果一个参数是以非const引用传入,c++编译器就有理由认为程序员会在函数中修改这个值,并且这个被修改的引用在函数返回后要发挥作用。但如果你把一个临时变量当作非const引用参数传进来,由于临时变量的特殊性,程序员并不能操作临时变量,而且临时变量随时可能被释放掉,所以,一般说来,修改一个临时变量是毫无意义的,据此,c++编译器加入了临时变量不能作为非const引用的这个语义限制。
2、error: cannot call member function without object
解决方法:找到.h文件,在方法前加上static修饰
3、g++编译报错原因分析expected type-specifier before
原因:因为没有引入相应的头文件,加入相应的.h可以解决
4、warning: ‘’ [-Wreorder]
产生这种问题是类成员初始化顺序不对,调整顺序即可;
5、error C2006:  #include expected a filename, found ‘ identifier’
中文对照:#include命令中需要文件名
分析:一般是头文件未用一对双引号或尖括号括起来,例如“#include stdio.h”
6、error  C2010:’ character’   : unexpected in macro formal parameter list
中文对照:带参宏的参数表表现未知字符
分析:例如“#define  s(r|) r*r”中参数多了一个字符‘|’ 
7、error  C2014:  preprocessor command must start as first nonwhite space
中文对照:预处理命令前面只允许空格
分析:每一条预处理命令都应独占一行,不应出现其他非空格字符 
8、error  C2064:  term does not evaluate to a function
中文对照:无法识别函数语言 
分析:1、函数参数有误,表达式可能不正确,例如“sqrt(s(s-a)(s-b)(s-c)); ”中表达式不正确 
2、变量与函数重名或该标识符不是函数,例如“int i,j; j=i(); ”中i不是函数   
9、error C2110:  cannot add two pointers
中文对照:两个指针量不能相加 
分析:例如“int *pa,*pb,*a; a = pa + pb; ”中两个指针变量不能进行“+”运算 
10、error  C2117:  ‘ xxx’ : array bounds overflow
中文对照:数组xxx边界溢出
【开发必看!C++常见错误合集和解决方法】分析:一般是字符数组初始化时字符串长度大于字符数组长度,例如“char str =  “ abcd” ; ”
11、error LNK1169: 找到一个或多个多重定义的符号”
有三个源文件,A.h、B.cpp、C.cpp。
A.h是头文件,其中声明了三个变量a1、a2、 a3。
B.cpp是A.h中所声明的类的实现源代码,C.cpp是主程序文件。B.cpp和C.cpp中均包含头文件 A.h。
12、#pragma warning(disable:4996)
这种微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。
如果你执意要用:请使用:#pragma warning(disable:4996) //全部关掉
13、ld: symbol(s) not found for architecture x86_64
出错原因: main.cpp中没有找到对应的函数名声明,没有在.cpp引用包含该函数名的头文件.h。
解决方法: 引入对应头文件。
14、ld: 1 duplicate symbol for architecture x86_64
出错原因:
main.cpp中和其它.c文件同时引入了相同的头文件,在main.cpp中调用头文件中的函数报错。
比如test.c和main.cpp同时通过include引入了test.h,然后在main.cpp中调用test.h中的printTest()函数。
解决方法:
去除test.c对test.h的引用。
15、与函数有关的错误
(1)所调用的函数在调用语句之后才定义,而又在调用前未声明;
(2)对函数声明与函数定义不匹配;
(3)误以为形参值的改变会影响实参的值;
(4)函数的实参和形参类型不一致;
(5)没有注意函数参数的求值顺序。

    推荐阅读