Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类内朋友的定义_C++ - Fatal编程技术网

C++ 类内朋友的定义

C++ 类内朋友的定义,c++,C++,我可以将友元函数/类的定义放在另一个类中吗?我的意思是这样的: class Foo { friend void foo() {} // 1 friend class Bar {}; // 2 }; gcc编译friend函数,但无法编译friend类。n3337 11.3/2 类不应在友元声明中定义。[示例: class A { friend class B { }; // error: cannot define class in friend declaration };

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

class Foo
{
    friend void foo() {} // 1
    friend class Bar {}; // 2
};
gcc编译friend函数,但无法编译friend类。

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
};
将代码更改为:-

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

您可以创建一个嵌套类,该类可以访问该类的私有成员。这就是你的意思吗

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

这可能在所有编译器中都不起作用,因为在C++标准缺陷报告之前,嵌套类没有特殊的访问。

可以在朋友声明中定义<代码>朋友< /C>函数,并且它具有无法以任何其他方式获得的有趣行为(在封闭类型是模板的情况下)。p> 不能在friend声明中定义
friend
类,也不需要这样做。如果要创建具有完全访问权限的内联新类型,只需创建嵌套类型即可。作为成员,它将拥有对封闭类型的完全访问权限。唯一的区别是在名称空间级别找不到该类型,但是如果需要,可以添加一个typedef(或者,在名称空间级别定义类,并在类内声明友谊)


该缺陷报告始于1998年,我希望大多数编译器至少实现C++03,因此这应该适用于所有非古代编译器。更相关的是,它还可以根据C++11标准访问私有成员。现在是该标准的一部分:
n3376 11.7[class.access.nest]
正如@DavidRodríguez dribeas所建议的那样,大多数编译器肯定至少实现了C++03,但我偶尔会被提醒,有少数不幸的编译器仍然使用Visual Studio 6.0。嵌套类已经可以访问父类成员,因此无需将其作为朋友
n3376 11.7[class.access.nest]
您是否有机会详细说明(或指向这样做的链接)“它有其他任何方式都无法获得的有趣行为(如果封闭类型是模板)”@DaveS:它将为每个实例化类型创建一个非模板自由函数,它将以一种只有通过ADL才能看到的方式来实现——也就是说,它不会污染封闭的名称空间。因此,它一般创建具有受限可见性的非模板函数。
class Outer {
   int x;
   class Inner {
      static void f( Outer& o ) { o.x = 5; } // fine
   };
};