全球朋友功能的前向声明

时间:2013-02-27 14:54:55

标签: c++ qt friend forward-declaration

我有以下命名空间和类层次结构:

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);

因此该功能必须是外部和内部的朋友。 问题并显示该函数在全局范围内:

friend uint qHash(Ns1::Outer::Inner const& el);
friend operator==(Ns1::Outer::Inner const& el1,
                Ns1::Outer::Inner const& el);

我无法处理此案件的前瞻性声明。任何解决方案?

1 个答案:

答案 0 :(得分:2)

编辑:

你是对的!您找到了一个语言无法处理的极端案例(因为friend发货声明仅适用于先前声明的函数,或者仅适用于最内层的命名空间)。不幸的是,这意味着您将不得不稍微重新构建代码,因为您想要做的事情不能以这种方式完成。

最简单的方法是在Ns1命名空间中定义两个函数,然后在using中将它们定义到全局命名空间中。除了嵌套命名空间中有两个额外的函数外,它基本上与你想要的效果完全相同。

您的其他选项包括从根本上解决问题:为什么您的类对象的公共接口不能提供足够的功能以便需要友谊?例如,如果您打算在全球范围内传递Inner个对象,为什么OuterInner内是私有的?

为什么散列和比较函数需要访问Inner的内部状态?为什么不让Inner提供一个公共比较接口,然后由运营商使用?