【发布时间】:2013-02-27 14:54:55
【问题描述】:
我有以下命名空间和类层次结构:
namespace Ns1 {
class Outer {
private:
class Inner {
};
QSet<Inner> set;
};
}
现在我需要声明一个全局函数:
uint qHash(Ns1::Outer::Inner const& el);
bool operator==(Ns1::Outer::Inner const& el1,
Ns1::Outer::Inner const& el);
所以函数必须是 Outer 和 Inner 的朋友。 问题并表明该函数在全局范围内:
friend uint qHash(Ns1::Outer::Inner const& el);
friend operator==(Ns1::Outer::Inner const& el1,
Ns1::Outer::Inner const& el);
我无法处理这种情况下的前向声明。有什么解决办法吗?
【问题讨论】:
-
为什么这个函数需要是一个“全局”函数?我认为问题本身就在这里。如果它可以接受的参数是
Ns1::Outer::Inner,那么我认为在命名空间Ns1之外创建函数没有任何意义。鉴于Inner是private到Outer,我也认为将其设为非成员函数没有任何意义。 -
请。问题就是我所说的问题。不要做你个人的假设。如果存在,请给出解决方案。
-
如果
Inner是私有的,你想如何获取Inner对象以将其传递给函数?这看起来像是一个设计问题——就像friend的许多用途一样。不,您不需要f成为Inner的朋友 - 除非它使用它的私有/受保护方法。 -
@user14416:解决方案可能不存在,因为您做出了错误的个人假设。
-
如果您在上下文中提供了一个带有
friend声明的组合示例,将会更加清晰。这也是定义吗?当它已经被 ADL 发现并且是大型重载集的一部分时,为什么还需要在命名空间范围内声明它?
标签: c++ qt friend forward-declaration