名稱空間與友元函式
阿新 • • 發佈:2018-12-31
定義流IO的友元函式很常見,但隨著專案變大,一般都將將類定義在某名稱空間內,這時,我們在該類中定義的友元函式和名稱空間是什麼關係?如果該友元函式在類的cpp檔案中實現,是放在名稱空間內還是放在名稱空間外?另外,對於該實現的函式,是否還需要給出函式宣告?也就是說,friend能否承擔宣告友元函式的責任?
標頭檔案:
#include <ostream> namespace ns_test { /* * type */ class CTestFriend { public: CTestFriend(int i): m_int(i) { // TODO Auto-generated constructor stub } virtual ~CTestFriend(); friend std::ostream & operator << (std::ostream & os, const CTestFriend & obj); private: int m_int; }; } /* namespace ns_test */
CPP檔案
#include "CTestFriend.h" namespace ns_test { CTestFriend::~CTestFriend() { // TODO Auto-generated destructor stub } std::ostream & operator << (std::ostream & os, const CTestFriend & obj) { os << obj.m_int << "\n"; return os; } } /* namespace ns_test */
上述程式碼,在實際的測試中,友元函式實現必須在名稱空間內,並且friend已經承擔了函式宣告的任務,在客戶程式碼,只需要包含上述標頭檔案即可;
如果將友元函式的實現放在名稱空間外,編譯時會提示,函式實現中無法訪問CTestFriend類的私有成員,也就是說,編譯器認為實現函式並不是該類的友元;
如果將friend宣告改成friend std::ostream & ::operator << (std::ostream & os, const CTestFriend & obj);,編譯器報該宣告前,應該在全域性宣告該函式,所以,此時的friend並沒有承擔友元函式的宣告任務。
以上,在gcc 版本 4.6.3上測試。有興趣的朋友,也可以在其它編譯器上試一試。