前向声明全局友元函数
forward declaration of global friend function
我有以下命名空间和类层次结构:
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
对象,为什么Inner
在Outer
内是私有的?
为什么哈希和比较函数需要访问Inner
的内部状态?为什么不让Inner
提供一个供运算符使用的公共比较接口呢?
相关文章:
- C++模板来检查友元函数的存在
- 如何使用单独文件中的派生类访问友元函数对象
- 模板化的类和友元函数
- 友元函数无法访问私有数据成员 (c++)
- 继承和友元函数,从基类访问受保护的成员
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 在模板类之外定义友元函数的正确方法是什么?
- 2个模板化类的非模板友元函数未定义引用错误
- C++ 友元函数和私有构造函数
- 使第二个类的构造函数成为第一个类中的友元函数
- 未定义的类模板不会实例化以检查友元函数
- C++类中的友元函数有问题?
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 模板类中的模板友元函数
- C++ 17 个友元函数声明和内联命名空间
- 友元函数需要一个帮助程序函数
- 在类内定义的友元函数与类外定义的友元函数的查找规则之间的差异
- 运算符重载在 C++ 中使用友元函数
- 类C++友元函数无法访问封装的类
- 函数指针作为友元函数