为什么成员类型需要前向声明而成员函数不需要?

Why do member types need to be forward declared while member functions needn't?

struct A
{
    void f1()
    {
        f2(); // ok, though f2() is not declared before
    }

    void f2()
    {}

    void f3(X*) // error: unknown type name 'X'
    {}

    struct X
    {};
};

int main()
{
    A a;
}

为什么成员类型需要前向声明而成员函数不需要?

这与complete-class context有关。当您在成员函数的主体中时,class 被认为是完整的,并且可以使用 class 中定义的任何内容,无论它在 class 中的何处声明。

函数参数不是该上下文的一部分,因此它们必须是您尝试使用它们时已知的类型。