Friend函数类内定义仅允许在非本地类定义中使用。这是什么意思?

时间:2016-07-09 10:11:18

标签: c++ friend

Here(参见第2点描述)我读到,只有非本地类定义才允许使用友元函数类内定义。

这是什么意思?

3 个答案:

答案 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;
}

来自cppreference.com

  

类声明可以出现在命名空间范围内(在这种情况下它)   在另一个类定义中定义一个普通的类(在其中)   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是函数内定义的类。