【问题标题】:Why do member types need to be forward declared while member functions needn't?为什么成员类型需要前向声明而成员函数不需要?
【发布时间】:2020-05-01 02:17:29
【问题描述】:
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;
}

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

【问题讨论】:

  • 你可以把它想象成函数体实际上出现在类定义之后,例如此代码与struct A { void f1(); void f2(); .... }; 后跟inline void A::f1() { f2(); } 几乎相同
  • 关于草率下结论的一点:您尝试过类似void f1() { X obj; f2(); } 的方法吗?当差异化因素是其他东西时,您确定了“类型与功能”。 (草率下结论并不全是坏事,但明智的做法是知道什么时候做。)

标签: c++ class types standards member-functions


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    相关资源
    最近更新 更多