问题一:声明与定义分离时报错
情况一:定义函数处的函数名不让过
该情况是因为没有声明类域 ,.cpp中的函数找不到对应的函数名
解决方案:
1、在前面声明类域以及命名空间(这里的mystring是自定义的命名空间)
.
2、放入命名空间里面(此时函数前面就不用声明命名空间了,但是函数名前面依旧需要加上类名)
后续.cpp内容全都放在命名空间内部
情况二:定义函数处的参数不让过
该情况是因为缺省参数同时用在了定义和声明的参数里面(C++不允许声明和定义同时给缺省参数)
解决方法:
1. 在定义里面去掉缺省参数(一般不会在声明的时候去除缺省)
问题二:编译时因为头文件的位置而报错
在此之前,我们要先理解.h文件的特性
- 该文件属于头文件,不会被编译
- 如果.cpp文件包含了.h的头文件,那么在预处理阶段,会将他展开(把.h的内容全部复制一份进去)
情况一:在.cpp文件中包含了一些头文件后(如iostream、命名空间展开…),编译不让过
上述文件中:
- .h文件没有包iostream、namespace std
- .cpp文件中包了iostream、namespace std
该情况是因为:当 .h文件拷贝进 .cpp文件中后,h文件中的函数找不到其对应的命名空间
解决方法:
1. 更改 .cpp中头文件的包含次序
因为对于包含进来的.h文件,他会向上去找匹配的条件。而在.h文件前面命名空间已经展开,所以能成功找到命名空间,就不会编译报错
2. .cpp文件中全部都不加任何除 .h之外的头文件,把那些头文件都放进 .h中,这样预处理的时候也就全部拿过来了
问题三:其他的一些小问题
情况一:输入输出流重载的报错(静态、全局变量/函数的声明与定义)
报错如图,这种错误第一次见到都会无从下手
其实错误很简单,就是包含头文件的时候,如果头文件里面有全局、静态变量/函数,那么就会导致这个变量/函数会被每个 .cpp文件包含一次。这就导致在链接的时候,会发生重定义现象(上图fatal error LNK1169也表明了是在链接的时候出的错)
解决方法:
1. 将该变量/函数放入.cpp文件中
提示:上图的范围for语句写的时候如果报错了,很有可能就是没有写迭代器,需要手动写一下迭代器。因为这个范围for会在编译的时候自动替换成迭代器
如上,就完成了对一些常见错误的处理
string类的一些接口的实现