[英]why can't my class friend function access a protected member with namespaces?
這通常是可行的,但是我對名稱空間的使用搞砸了。
采取以下代碼:
。H:
class FetchRecord
{
friend KxStream& operator<<( KxStream& os, FetchRecord& r );
protected:
int mId;
};
的.cpp:
KxStream& operator<<( KxStream& os, FetchRecord& r )
{
os << r.mId;
return os;
}
這很好。 但是如果我這樣做:
。H:
namespace Blah
{
class FetchRecord
{
friend KxStream& operator<<( KxStream& os, FetchRecord& r );
protected:
int mId;
};
}
的.cpp:
using namespace Blah;
KxStream& operator<<( KxStream& os, FetchRecord& r )
{
os << r.mId;
return os;
}
然后,朋友decl似乎被忽略了:
src/fetch.cpp:153:25: error: 'mId' is a protected member of 'Blah::FetchRecord'
我可以判斷發生了什么-.cpp中的功能與朋友decl中的功能不匹配。 您如何解決呢?
@Update:現在下面有兩個正確答案。 謝謝。 經過測試和工作。 但是我討厭不得不將我的operator <<函數放在Blah命名空間中。 如果該函數的完整原型為:
KxStream& operator<<( KxStream&, Blah::FetchRecord& );
也就是說,如果我能以某種方式向前在名稱空間Blah之外聲明該朋友功能。 我找到了一種方法:
namespace Blah
{
class FetchRecord;
}
KxStream& operator<<( KxStream& os, Blah::FetchRecord& r );
namespace Blah
{
class FetchRecord
{
friend KxStream& ::operator<<( KxStream& os, FetchRecord& r );
};
}
您必須從表面上明確。 注意operator <<的朋友定義中的“ ::”。
在第二種情況下,您在全局名稱空間中定義了operator<<
,它與您在.h文件中聲明的內容無關。 您應該在namespace Blah
定義它:
namespace Blah {
KxStream& operator<<( KxStream& os, FetchRecord& r )
{
os << r.mId;
return os;
}
}
更新:如果要讓operator<<
屬於全局名稱空間(這很奇怪,由於使用了ADL ,即使不using namespace Blah
也可以using namespace Blah
它),您可以在.h文件中編寫以下內容,並保留.cpp文件原樣:
namespace Blah
{
class FetchRecord;
}
KxStream& operator<<( KxStream& os, Blah::FetchRecord& r );
namespace Blah
{
class FetchRecord
{
friend KxStream& ::operator<<( KxStream& os, FetchRecord& r );
// ^^^^
protected:
int mId;
};
}
盡管using namespace Blah
,但在定義函數時仍需要限定名稱,因為Blah
是在其中聲明名稱空間的名稱空間。 它應該是:
KxStream& Blah::operator<<( KxStream& os, FetchRecord& r )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.