在用多文件编译来写一个程序时,遇到了一个错误:
错误C3646“name”: 未知重写说明符
于是我就去某搜索引擎上搜索一下前辈们对这个错误的心得
综合网上的经验我总结了一下出现这个错误有可能的几种情况:
1、头文件之间的循环引用
比如:在a.h中包含了b.h并创建了一个b类对象,然后在b.h中又包含了a.h。
解决方法:检查工程的头文件包含关系,防止头文件的循环引用。
2、分号问题
在头文件的代码里面粗心使用了中文的分号(通常有可能是在报错代码的上一行)
解决方法:检查报错头文件中的符号
3、在使用一个类中包含了另一个类时两个类的定义顺序不对
示例代码:
class A{
B b;
}
class B{
int i;
}
在这段代码中,类A中使用了类B来定义了一个对象,但是此时类B的定义却在类A之后,这就可能产生了“未知重写说明符”的错误。
解决方法:检查类的生命顺序,被包含的类的生命顺序应该在包含它的类之前。
#include
#include
#include"student.h"
using namespace std;
程序很简单,只有两个文件,main.cpp和student.h,这是main.cpp的宏定义部分(Student.h没有宏定义,直接开始定义类)。而这样编译之后,在student.h的编译中就会报错:错误C3646“name”: 未知重写说明符(下面还有很多,都是这种,就不一一列举了)
在经过多次胡乱尝试之后,我发现如果将#inlcude"student.h"放在using namespace std;下面时,这个程序就可以正常运行了。修改之后的main.cpp宏定义部分如下:
#include
#include
using namespace std;
#include"student.h"
这样就没有“未知重写说明符”的错误了,虽然这次歪打正着,但是也说明自己了对using namespace的理解不够。
于是再查了一些关于using namespace的东西。