我的远期申报 class B; 上课前 A 在以下代码中不起作用,即使在 this answer 提到在函数的参数中使用不完整类型的正向声明时应该有效。
class B;
A
它抛出了一个错误 A::func() 说“未定义的B型”。解决这个问题的方法是什么?为什么我的前向声明在这种情况下不起作用?
A::func()
密码
#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); }
来自C++17标准(6.2一个定义规则,第5页)
类类型T必须是完整的,如果 (5.9)返回类型或参数类型为T的函数 是 定义 (6.1)或称为(8.2.2),或
类类型T必须是完整的,如果
(5.9)返回类型或参数类型为T的函数 是 定义 (6.1)或称为(8.2.2),或
为了避免错误,请定义成员函数 func 课外 A 在类的定义之后 B 例如
func
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; }