2

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

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

我无法处理这种情况下的前向声明。有什么解决办法吗?

4

1 回答 1

3

编辑:

你是对的!您发现了该语言无法处理的极端情况(因为friend船舶声明仅适用于先前声明的函数或最里面的命名空间)。不幸的是,这意味着您将不得不稍微重组您的代码,因为您想要做的事情不能完全以这种方式完成。

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

您的另一组选项涉及从根本上解决问题:为什么您的类对象的公共接口没有提供足够的能力,以至于需要友谊?例如,如果您打算能够在全局范围内传递对象,为什么是Inner私有的?OuterInner

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

于 2013-02-27T16:18:30.533 回答