簡體   English   中英

為什么我的類朋友功能不能使用名稱空間訪問受保護的成員?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM