C++ 为什么可以';my class friend函数不能访问具有名称空间的受保护成员吗?

C++ 为什么可以';my class friend函数不能访问具有名称空间的受保护成员吗?,c++,namespaces,C++,Namespaces,这是一种正常的工作方式,但我对名称空间的使用把它搞砸了 以这个代码为例: .h: 我可能知道发生了什么-在.cpp中的函数与在friend decl中的函数不匹配。你如何解决这个问题 @更新:下面是两个正确答案。谢谢测试和工作。但是我讨厌在第二种情况下必须使用运算符定义运算符尽管使用了名称空间Blah,但在定义函数时仍然需要限定名称,因为Blah是声明函数的名称空间。应该是: KxStream& Blah::operator<<( KxStream& os, Fetc

这是一种正常的工作方式,但我对名称空间的使用把它搞砸了

以这个代码为例:

.h:

我可能知道发生了什么-在.cpp中的函数与在friend decl中的函数不匹配。你如何解决这个问题


@更新:下面是两个正确答案。谢谢测试和工作。但是我讨厌在第二种情况下必须使用运算符定义
运算符尽管
使用了名称空间Blah
,但在定义函数时仍然需要限定名称,因为
Blah
是声明函数的名称空间。应该是:

KxStream& Blah::operator<<( KxStream& os, FetchRecord& r )

KxStream&Blah::操作员纠正错误并工作。但我希望有另一种方式。我不喜欢那样,我的朋友operator@RafaelBaptista然后在将其声明为好友之前在名称空间之外声明它。找不到一种不太难看的方法。例如,普通的前向decl和gcc视为两个不同的函数。@RafaelBaptista该函数位于全局命名空间中,因此友元decl需要是
friend[…]::运算符更正并工作。但我希望有另一种方式。我不喜欢那样,我的朋友operator@RafaelBaptista你为什么不喜欢呢?哈哈。这正是我刚才在问题更新中发布的内容。@Rafaelbaspatista不太喜欢!是 啊我的实际工作代码与您的示例一样。我在上面的更新中把“:”的位置搞砸了。还有保留操作员的原因
KxStream& operator<<( KxStream& os, FetchRecord& r )
{
   os << r.mId;
   return os;
}
namespace Blah
{
    class FetchRecord
    {
       friend KxStream& operator<<( KxStream& os, FetchRecord& r );
    protected:
       int mId;
    };
}
using namespace Blah;

KxStream& operator<<( KxStream& os, FetchRecord& r )
{
   os << r.mId;
   return os;
}
src/fetch.cpp:153:25: error: 'mId' is a protected member of 'Blah::FetchRecord'
KxStream& operator<<( KxStream&, Blah::FetchRecord& );
namespace Blah
{
   class FetchRecord;
}

KxStream& operator<<( KxStream& os, Blah::FetchRecord& r );

namespace Blah
{
   class FetchRecord
   {
      friend KxStream& ::operator<<( KxStream& os, FetchRecord& r );
   };
}
namespace Blah {
    KxStream& operator<<( KxStream& os, FetchRecord& r )
    {
       os << r.mId;
       return os;
    }
}
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;
    };
}
KxStream& Blah::operator<<( KxStream& os, FetchRecord& r )