C 的乙個友員錯誤 聯想

2021-04-02 07:52:24 字數 762 閱讀 4823

c++的友員,應該都是知道一點,但就是很能深入。

今天我在devc++上發現各問題。

程式如下

#include

namespace c

;void f()

}namespace b;}

int main()

當我用using c::f;時程式出錯,提示為:

15 d:/coder/dev-cpp/project/test1/main.cpp `void b::f()' conflicts with previous using declaration `void c::f()'

說 b::f()和 c::f()衝突。。。

按我的想法是, 在class a中的friend void f();宣告,可以是 namespace b中的 void f()的第一次宣告。這個宣告的效果就相當於在class a的前面有個 void f()宣告一樣。

這樣一來,using c::f;帶來了二次宣告的衝突。

當使用 using namespace c;時因為  c::f被引入到 f查詢的全域性名字空間中了,所以namespace  b中的 class a前面那個隱式的 void f();宣告遮蔽掉了外面的。

這裡隱含的錯誤沒有被觸發,所以程式執行正確(b::f()其實不存在) 。

從這個例子中,我個人總結為:

friend宣告是個 自由宣告(非受限宣告)時,其實是在class的前面插個宣告,也就是說

friend的自由宣告 引用 是 class所在名字空間的 成員。

關於友員函式的低階錯誤

類的友員函式可以直接訪問該類的所有成員,但它不是成員函式,可以象普通函式一樣在任何地方被呼叫 這樣看上去,友員函式與成員函式的區別就僅僅在於友員函式可以在任何地方被呼叫,於是我寫了下面的 class cdemo void showmsg void cout m a 無法通過編譯,顯示m a沒有定義。...

關於友員函式的低階錯誤

類的友員函式可以直接訪問該類的所有成員,但它不是成員函式,可以象普通函式一樣在任何地方被呼叫 這樣看上去,友員函式與成員函式的區別就僅僅在於友員函式可以在任何地方被呼叫,於是我寫了下面的 class cdemo void showmsg void cout m a 無法通過編譯,顯示m a沒有定義。...

乙個友元類使用誤區(C )

這個問題,我困擾了好一會,決定記錄一下。問題 簡化如下 class b class a 編譯出錯提示資訊 bool a operator int,int is private 你知道問題出現在 嗎?如果你看出來了,那麼恭喜你,我是花了挺長時間糾結的。我的理解是這樣的。類a有乙個刪除的預設建構函式,類...