什么时候在C ++中发生不完整的类型错误

Nic*_*kal 2 c++ incomplete-type

谁能告诉我C ++编译器何时引发“不完整的类型错误”?

注意:我故意将这个问题留给了一些开放的答案,以便我自己调试代码。

Mik*_*hke 5

通常在编译器看到前向声明但没有此类型的完整定义,而该类型在某处使用时发生。例如:

class A;

class B { A a; };
Run Code Online (Sandbox Code Playgroud)

第二行将导致编译器错误,并且根据编译器的不同,将报告一个不完整的类型(其他编译器会为您提供不同的错误,但含义相同)。

但是,当您仅使用指向此类前向声明​​的指针时,不会抱怨,因为始终知道指向类的指针的大小。像这样:

class A;
class B {
   A *a;
   std::shared_ptr<A> aPtr;
};
Run Code Online (Sandbox Code Playgroud)

如果您问出现此错误时在具体的应用程序或库中可能出什么问题:通常在包含包含前向声明的标头但尚未找到完整定义的情况下发生。解决方案非常明显:还包括可让您访问完整类型的标头。有时您可能也只是没有类型而使用了错误的名称空间,而需要更正该名称空间。