C++ 使用friend函数时出现不完整类型

C++ 使用friend函数时出现不完整类型,c++,friend-function,C++,Friend Function,为什么它说的是不完整类型,为什么我不能像这样使用friend函数 #include<iostream> using namespace std; class test; class test2{ public: void outd(test t) { cout <<t.x<<endl; cout<<t.y<<endl; } }; class test{ int x;

为什么它说的是不完整类型,为什么我不能像这样使用friend函数

#include<iostream>
using namespace std;
class test;
class test2{
    public:
    void outd(test t)
    {
        cout <<t.x<<endl;
        cout<<t.y<<endl;
    }
}; 
class test{

  int x;  
    int y;
    friend void test2::outd(test t);
public:
    test(int x,int y)
    {
        this->x=x;
        this->y=y;
    }

};



int main()
{
    test t(1,2);
    test2 z;
    z.outd(t);
}
#包括
使用名称空间std;
课堂测试;
类test2{
公众:
无效输出(测试t)
{

cout声明类
test
后,必须定义方法
test2::outd

#include<iostream>
using namespace std;
class test;
class test2{
  public:
  void outd(test t);
};
#包括
使用名称空间std;
课堂测试;
类test2{
公众:
脱空(试验t);
};
编辑 (回应评论) 这称为远期申报

以下形式的声明 类密钥属性标识符


声明稍后将在此范围中定义的类类型。在定义出现之前,此类名的类型不完整。这允许相互引用的类以及指定给该类的类型为不完整类。

在声明类
测试
后,必须定义方法
test2::outd

#include<iostream>
using namespace std;
class test;
class test2{
  public:
  void outd(test t);
};
#包括
使用名称空间std;
课堂测试;
类test2{
公众:
脱空(试验t);
};
编辑 (回应评论) 这称为远期申报

以下形式的声明 类密钥属性标识符


声明稍后将在此范围中定义的类类型。在定义出现之前,此类名的类型不完整。这允许相互引用的类以及指定给该类的类型为不完整类。

请确保除非编译人员看到完整声明,否则无法使用
测试中的任何成员变量当然,除非代码完全被编译器看到,否则不能使用任何成员变量。除非是完整的声明。是的!谢谢!但是我可以知道为什么这个工作吗?@ CurristyJyver历史上,C和C++编译器按顺序处理源文件,所以要求是按顺序出现的。通常是很好的。除非您有循环依赖项(如本例中所示)在某些情况下,在C++中,这不适用。例如,即使它们还没有被声明,类也可以引用他们自己的成员和方法。是的,它工作!!非常感谢,但是我可以知道为什么这个工作吗?@ CurristyJyver历史上,C和C++编译器按顺序工作通过源文件,所以要求是TH。除非出现循环依赖关系(如本例中),否则,通常情况下是良好的。在某些情况下,C++不适用。例如,即使它们还没有被声明,类也可以引用自己的成员和方法。