2012-08-29 44 views
2

我可以把朋友函数/类的定义放在另一个类中吗?我的意思是这样的:朋友内类定义

class Foo 
{ 
    friend void foo() {} // 1 
    friend class Bar {}; // 2 
}; 

gcc编译好友功能,但不能编译好友类。

回答

6

可以定义在friend声明一个friend功能,它具有无法得到任何其他方式(在封闭类型是一个模板的情况下),有趣的行为。

您不能在中定义 a friend类的朋友声明,并且没有必要这样做。如果要创建一个新的类型内联具有完全访问权限,您可以创建一个嵌套类型。作为成员,它将拥有完全访问封闭类型的权限。唯一的区别是类型不会在命名空间级别找到,但是如果需要的话可以添加typedef(或者,也可以在名称空间级别定义类,并在类中声明友谊)。

class Outer { 
    int x; 
    class Inner { 
     static void f(Outer& o) { o.x = 5; } // fine 
    }; 
}; 
+1

任何你可以详细阐述的机会(或者指向这样做的链接)“它具有无法以任何其他方式获得的有趣行为(在封闭类型是模板的情况下)” –

+0

@DaveS:它会创建一个非模板化的免费功能适用于每种即时类型,并且只能通过ADL才能看到--ie它不会污染封闭的名称空间。所以它*一般*创建具有受限可见性的非模板化函数。 –

3

n3337 11.3/2

类应在朋友声明来定义。 [示例:

class A { 
friend class B { }; // error: cannot define class in friend declaration 
}; 

末端示例]

但是你可以使用类似

class Foo 
{ 
    friend void foo() {} // 1 
    class Bar { }; 
    friend class Bar; // 2 
}; 
+6

嵌套类已经可以访问父母成员,所以不需要将它变成朋友。 'n3376 11.7 [class.access.nest]' –

0

更改代码: -

class Foo 
{ 
    friend void foo() {} // 1 
    friend class Bar ; // 2 
}; 
1

可以使其中嵌套类,according to defect report 45,可以访问班级的私人成员。这是你的意思吗?

“嵌套类是一个成员,因此具有与任何其他成员相同的访问权限。”

这可能不适用于所有编译器,因为在此C++标准缺陷报告之前,嵌套类没有特殊访问权限。

+2

这个缺陷报告的日期从1998年开始,我期望大多数编译器至少实现* C++ 03,所以这应该在* all *非古代编译器中工作。 –

+0

更为相关的是,它也可以根据C++ 11标准访问私有成员。 –

+1

现在是标准的一部分:'n3376 11.7 [class.access.nest]' –