有人能告诉我c ++编译器何时抛出“不完整类型错误”?
注意:我故意将这个问题稍微开放一下,以便我自己调试代码。
答案 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>