2013-03-27 76 views
0

所以昨天我问了这个问题private friend operator<< 关于如何让operator<<私人的类。我得到了一个非常好的答案, 完全按照我的意愿工作,但我还有一些其他问题。私人朋友运营商的代理类<<

首先,我不明白代理类怎么不一定是朋友private_printable?我如何可以从operator<<以内访问private_printable的内部成员?

其次,虽然从答案的代码打,我写了这个:

operator proxy() const { return *this; } 

起先似乎确定了我,它甚至编译,但是当我运行它,并得到了段错误 我意识到,我还没有为代理类定义任何构造函数, 将采用private_printable作为参数,从而允许转换。 那么,我的代码如何编译,甚至没有给我任何警告?

然后我做的第三件事是给代理一个构造函数,它的参数 到private_printable作为它的参数(我没有明确说明)而不是定义转换运算符。 现在一切正常,除了再次有可能拨打operator<<private_printable。但我不确定,为什么发生这种情况。 是因为ADL吗?我对此有一些模糊的理解,但我不确定其所有细节。无论如何,proxy类是私人的,那么为什么 ADL有什么不同?

回答

1
  1. ,因为它是一个private_printablefriend可以operator<<访问private_printable成员。这不是proxyfriend

  2. return *this返回一个private_printable对象,必须将其隐式转换为proxy。如何把private_printable转换成proxy?致电private_printable::operator proxy()。但是,这是我们已经在的功能!段错误是由无限递归堆栈溢出引起的。对于它的价值,无限循环将是另一个可能的结果。

  3. 非易失explicit构造也是一个转换功能,服务于相同的目的operator proxy。 ADL是涉及到的,就像使用了operator proxy并且没有构造函数一样。当然,解决方案是使构造函数explicit。只有在构造函数的唯一操作数是代理类的情况下,该问题才会发生。

proxy类是一个private成员只有当你明确地将其命名为重要。 ADL仍然可以使用proxy参数找到一个函数,然后间接导致访问转换函数,因为使用类类型不受访问限定的影响。只有名称查找受到影响。同样,如果您只有typedef,您总是可以使用private成员类型。

+0

再次感谢您的帮助,现在我清楚了:) – jcxz 2013-03-27 16:23:52