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

时间:2017-07-07 05:33:21

标签: c++ incomplete-type

有人能告诉我c ++编译器何时抛出“不完整类型错误”?

注意:我故意将这个问题稍微开放一下,以便我自己调试代码。

4 个答案:

答案 0 :(得分:3)

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

class A;

class B { A a; };

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

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

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

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

答案 1 :(得分:1)

当您在带有默认析构函数的类中对std::unique_ptr使用向前声明(例如,实现PIMPL习惯用法)时,也会发生这种情况。

在这里很好地解释:Forward declaration with unique_ptr?

答案 2 :(得分: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;
}

答案 3 :(得分:0)

就我而言,这是由于对模板的了解不足。我在模板定义和与该模板关联的函数之间声明了一个类。

template<typename T>
class
{
  foo a;
  foo b;
};
function(T a,int b)
{

 . . . . .

}

由于模板定义与类相关联,因此产生了问题,在这种情况下,T is not defined以及incomplete type is not allowed的函数的参数列表中都会出现错误。如果必须为多个实体使用模板,则必须在该实体的定义之前重用以下语句:

template<typename T>