【发布时间】:2011-09-19 04:12:16
【问题描述】:
class private_object
{
private:
struct make_public;
friend struct make_public;
static void method1() {}
};
struct private_object::make_public
{
class nested_outer
{
void callFromOuter()
{ private_object::method1(); } // Should this be an error?
class nested_inner
{
void callFromInner()
{ private_object::method1(); } // How about this one?
};
};
};
当我尝试移植一个开源项目以在 borland 下编译时,出现了这个友谊问题。根据parashift和两个半相关的问题here和here,上面的例子应该是无效的。
然而,在 7 个不同的编译器1 上对其进行测试后,只有 borland 和 dmc 抱怨。这种行为让我感到惊讶,因为我没想到友谊在嵌套类中是可传递的。
所以这提出了几个问题:
- 什么是正确的行为?我猜这是大多数编译器都接受的那个。
- 如果这是正确的行为,为什么这个友谊传递性实例可以?
- 如果这是正确的,那么这也意味着标准的变化。在标准中允许这样做的原因可能是什么?
- 对于拒绝此代码的编译器,什么是合适的解决方法?请记住,实际项目可能包含相当深的嵌套,因此我正在寻找半可扩展的解决方案。
1。在 mingw-gcc 4.5.2、clang、borland c++ builder2007、digital mars、open watcom、visualc2010 和 comeau online 上测试
【问题讨论】:
标签: c++ friend standards-compliance