拆分C++类后出现'does not name a type'错误,Board无法识别异常类
解决拆分IllegalCoordinateException类后的编译错误
嘿,我一眼就瞅出问题出在哪了——你这两个头文件的写法犯了两个经典的C++编译错误,咱们一步步来修复:
1. 头文件保护宏撞车了!
你看你的Board.h和IllegalCoordinateException.h居然都用了CIRC_H作为头文件保护宏!这就好比两个人抢同一个名字,预处理的时候,当编译Board.cpp时,先加载Board.h并定义了CIRC_H,接着加载IllegalCoordinateException.h时,发现CIRC_H已经存在,直接跳过了整个异常类的定义代码——这可不就报“未声明”嘛!
赶紧给每个头文件换个独一无二的宏:
// Board.h 修改后 #ifndef BOARD_H #define BOARD_H #include "IllegalCoordinateException.h" // 你的Board类定义代码 #endif
// IllegalCoordinateException.h 修改后 #ifndef ILLEGAL_COORDINATE_EXCEPTION_H #define ILLEGAL_COORDINATE_EXCEPTION_H // 先删掉#include "Board.h",原因后面说 // 你的IllegalCoordinateException类定义代码 #endif
2. 循环引用搞乱了声明顺序
你之前在IllegalCoordinateException.h里包含了Board.h,同时Board.h又包含了IllegalCoordinateException.h,这种循环引用会让预处理程序绕圈圈,根本没法正确解析两个类的声明顺序。
- 如果你的异常类不需要用到Board类的具体实现(比如只是抛出异常,不需要持有Board对象或调用它的成员函数),那直接删掉IllegalCoordinateException.h里的
#include "Board.h"就好。 - 如果确实需要用到Board类,别直接包含头文件,用前向声明就行,在IllegalCoordinateException.h开头加一句:
这样编译器就知道Board是一个类,不会报错,又不会引入整个头文件导致循环。class Board;
3. 最后检查Board.cpp的头文件包含
确保Board.cpp的开头包含了必要的头文件:
#include "Board.h" #include "IllegalCoordinateException.h"
其实Board.h已经包含了异常类的头文件,加不加这句都行,但加上更稳妥,能避免某些边缘情况。
现在再用你原来的编译命令试试:
$ g++ -g -Og -std=c++0x main.cpp Board.cpp IllegalCoordinateException.cpp
应该就能正常编译了!
内容的提问来源于stack exchange,提问作者Tomer
相关产品推荐
相关产品推荐

