##沒有躲過的坑--頭文件相互包含(Compiler error C2653: not a class or namespace name)
最近被自己坑兒了一把,改別人的代碼,最后編譯器這樣報錯的:
**error C2653: not a class or namespace name**
簡單描述一下:?
有一個類A,聲明和實現分別位于 a.h和a.cc中?
有一個類B,聲明和實現分別位于 b.h和b.cc中?
類A的某個成員函數需要B類類型作為參數?
類B的某個成員函數需要A類類型作為參數
a.h文件如下:
~~~
#ifndef A_H_
#define A_H_
#include "b.h"
class A
{
public:
enum State
{
RIGHT = 0;
ERROR = 1;
}
void send (B b);
...
};
#endif
~~~
a.cc文件省略,無影響
b.h文件是這樣的:
~~~
#ifndef B_H_
#define B_H_
#include "a.h"
class B
{
public:
void send (A::State state);
...
};
~~~
此時呢,編譯器就會報錯:?
error C2653: A not a class or namespace name
這時候我們的第一反應往往是查看b.h中是否包含了A類所在的頭文件,即是否包含了a.h文件。
但是坑爹的是,我們明明包含了呀,怎么還會報錯呢?
好吧,就是相互包含的事兒,編譯器已經蒙掉了。?
簡而言之就是不要包含不必要的頭文件。
偶對了 差點忘告訴怎么修改了?
首先,我們是把類A和B放在了一個命名空間中,即對A和B都進行了 namespace KENG{ }封裝。
所以這個時候,我們可以在A中不包含B的頭文件,而改成前置聲明、、、、、
~~~
#ifndef A_H_
#define A_H_
class B;
class A
{
public:
enum State
{
RIGHT = 0;
ERROR = 1;
}
void send (B b);
...
};
#endif
~~~
大功告成!?
我們用#ifndef躲過了重復包含頭文件的坑兒,但是我們也不能肆無忌憚的包含,更要避免相互包含的情況!!!
- 前言
- deprecated關鍵字
- 指針(內存泄露)
- 頭文件相互包含(Compiler error C2653: not a class or namespace name)
- 獲取一張圖片的width和height
- This function or variable may be unsafe.
- 智能指針陷阱
- wstring與string的轉換
- windows下chrome瀏覽器插件不能安裝
- 重定義關鍵字
- 正確釋放vector的內存
- 獲取設備環境HDC
- 抽象類不能實例化對象(但是你明明定義的不是抽象類)
- 重載賦值運算符的自我賦值
- 程序中的變量未初始化
- 成對使用new和delete時要采取相同的形式
- 意想不到的除數為零
- map的初始化(插入數據)
- 正則表達式截取字符串
- 捕獲窗口之外的鼠標消息(鉤子還是??)
- 類中的靜態成員變量(static or const static)
- 有if就要有else(一定成對)
- map查找結果處理
- 使用using namespace std的壞習慣
- new一個指針數組、以及創建動態二維數組
- 使用太多的全局變量
- 沒有及時break出for循環
- vector使用erase后迭代器變成野指針
- C++函數的默認參數(重新定義默認參數)
- 0xC0000005: 讀取位置 xxx時發生訪問沖突
- std::string初始化、最快速判斷字符串為空
- 你開發的軟件安裝在C盤Program Files (x86)下產生的異常