前向声明全局友元函数

forward declaration of global friend function

本文关键字:友元 函数 全局 声明      更新时间:2023-10-16

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

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

我不能处理这种情况下的前向声明。有解决方案吗?

EDIT:

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

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

你的另一组选项涉及解决问题的根源:为什么你的类对象的公共接口不提供足够的能力,这样需要友谊?例如,如果你打算在全局范围内传递Inner对象,为什么InnerOuter内是私有的?

为什么哈希和比较函数需要访问Inner的内部状态?为什么不让Inner提供一个供运算符使用的公共比较接口呢?