何时在C ++中发生不完整类型错误

问题描述 投票:0回答:2

任何人都可以告诉我什么时候c ++编译器抛出“不完整的类型错误”?

注意:我故意将此问题稍微开放,以便我可以自己调试我的代码。

c++ incomplete-type
2个回答
3
投票

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

class A;

class B { A a; };

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

然而,当您只使用指向此类前向声明​​的指针时,不会出现任何抱怨,因为指向类的指针的大小始终是已知的。像这样:

class A;
class B {
   A *a;
   std::shared_ptr<A> aPtr;
};

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


0
投票

当我们尝试使用类/对象或其方法并且尚未定义它们时会发生这种情况。例如

class A;
class B {
    class A obj;
}

要么

class A;
class B {
    class A *obj;
    B() {   
           obj->some_method();
        }

要解决这个问题,必须首先定义A或者必须给出其总声明(最佳实践是在头文件中执行),并且应该稍后定义这两个类的所有方法(最佳做法是在另一个文件中执行) )。

class A {
    //definition
}
class B {
class A obj;
}
© www.soinside.com 2019 - 2024. All rights reserved.