代码之家  ›  专栏  ›  技术社区  ›  user123456

在成员函数中用作参数时,正向声明不起作用

  •  1
  • user123456  · 技术社区  · 2 年前

    我的远期申报 class B; 上课前 A 在以下代码中不起作用,即使在 this answer 提到在函数的参数中使用不完整类型的正向声明时应该有效。

    它抛出了一个错误 A::func() 说“未定义的B型”。解决这个问题的方法是什么?为什么我的前向声明在这种情况下不起作用?

    密码

    #include <iostream>
    using namespace std;
    
    class B;
    
    class A
    {
    public:
        A()
        {
            cout << "in A's default ctor" << endl;
        }
    
        void func(B b1)
        {
            cout << "in A's func" << endl;
        }
    private:
        int x;
    };
    
    class B
    {
    public:
        B()
        {
            cout << "in B's default ctor" << endl;
        }
    
        B(const B& b1)
        {
            cout << "in B's copy ctor" << endl;
        }
    
        B& operator=(const B& b1)
        {
            cout << "in B's copy assignment operator" << endl;
            return *this;
        }
        
    };    
    
    int main()
    {
        A a;
        B b;
    
        a.func(b);
    }
    
    1 回复  |  直到 2 年前
        1
  •  2
  •   Vlad from Moscow    2 年前

    来自C++17标准(6.2一个定义规则,第5页)

    类类型T必须是完整的,如果

    (5.9)返回类型或参数类型为T的函数 是 定义 (6.1)或称为(8.2.2),或

    为了避免错误,请定义成员函数 func 课外 A 在类的定义之后 B 例如

    class B;
    
    class A
    {
    public:
        //...
        void func(B b1);
        //...
    };
    
    class B
    {
        //...
    };
    
    void A::func(B b1)
    {
        cout << "in A's func" << endl;
    }
    

    或者没有转发声明,比如

    class A
    {
    public:
        //...
        void func(class B b1);
        //...
    };
    
    class B
    {
        //...
    };
    
    void A::func(B b1)
    {
        cout << "in A's func" << endl;
    }