这是通常的作品,但我使用名称空间是搞砸了。为什么我的班级朋友不能使用名称空间访问受保护的成员?
把这个代码:
.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中的函数不匹配。你如何解决这个问题?
@更新:现在下面两个正确的答案。谢谢。经过测试和工作。但我讨厌不得不把我的运营商< <函数放在Blah命名空间中。这将是清洁的,如果完全原型的功能是:
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);
};
}
你必须得到直白。请注意运营商< <的朋友decl中的“::”。
正确和工作。但我希望有另一种方式。我不喜欢我的operator << function在Blah命名空间中。 – 2014-12-10 22:32:22
@RafaelBaptista你为什么不喜欢它? – 2014-12-10 22:45:48
哈哈。恰恰是我刚刚在我的问题更新中发布的内容。 – 2014-12-10 22:48:00