Here(参见第2点描述)我读到,只有非本地类定义才允许使用友元函数类内定义。
这是什么意思?
答案 0 :(得分:2)
非本地课程是非本地课程。
本地类是函数中定义的类 - 请参阅“本地类”on this page
段落“Friend函数类内定义”是指在类中声明和定义非成员函数的能力,该类是它所包含的类的朋友。
class a_class
{
friend std::ostream& operator<<(std::ostream& os, const a_class& x)
{
// ...
}
};
答案 1 :(得分:1)
非本地类定义是未在其他类的主体中定义的定义,或者未嵌入到函数体中的定义。
所以基本上你可以这样做:
#include <iostream>
struct NonLocal
{
friend std::ostream& operator<<(std::ostream& os, const NonLocal& l)
{
os << l.x;
return os;
}
private:
int x;
};
int main()
{
NonLocal nl;
std::cout << nl;
}
但你不能这样做:
#include <iostream>
int main()
{
struct Local
{
friend std::ostream& operator<<(std::ostream& os, const Local& l) // this will fail to compile
{
os << l.x;
return os;
}
private:
int x;
};
Local l;
std::cout << l;
}
类声明可以出现在命名空间范围内(在这种情况下它) 在另一个类定义中定义一个普通的类(在其中) case它定义了一个嵌套类),并且在一个函数体内,在 在哪种情况下,它定义了本地类。这样一个类的名称 存在于函数范围内,无法在外部访问。
- 本地班级不能拥有静态成员
- 本地班级的会员职能没有联系
- 本地类的成员函数必须完全在类主体
中定义- 闭包类型以外的本地类(自C ++ 14起)不能有成员模板
- 本地课程不能有朋友模板
- 函数内部的本地类(包括成员函数)可以访问封闭函数可以访问的相同名称。
- 本地类不能用作模板参数(直到C ++ 11)
[强调我的]
答案 2 :(得分:0)
这意味着你不能这样做:
void function ()
{
class X
{
int a;
friend void friend_set(X& p, int i)
{
p.a = i;
}
public:
void member_set(int i)
{
a = i;
}
};
}
Local-classes是函数内定义的类。