有人可以告诉我什么时候C++编译器会抛出“不完整类型错误”吗?
注意:我故意让这个问题留下了一些空间,以便我自己调试代码。
有人可以告诉我什么时候C++编译器会抛出“不完整类型错误”吗?
注意:我故意让这个问题留下了一些空间,以便我自己调试代码。
通常这种情况发生在编译器看到一个类型的前向声明但没有看到完整定义时,该类型正在某处被使用。例如:
class A;
class B { A a; };
第二行会导致编译器错误,并且根据编译器的不同,可能会报告不完整的类型(其他编译器会给出不同的错误,但含义相同)。
然而,当您只使用指向这种前向声明的指针时,不会出现任何抱怨,因为类的指针大小始终是已知的。就像这样:class A;
class B {
A *a;
std::shared_ptr<A> aPtr;
};
如果你在使用一个具体的应用程序或库时出现了这个错误,请问可能有什么问题:通常情况下,这种情况发生在包含前向声明的头文件没有找到完整定义的情况下。解决方案非常明显:还要包括可以访问完整类型的头文件。有时,您可能只是没有使用正确的命名空间或者使用了错误的命名空间,需要进行更正。Node
指针的二叉树Node
类),这也会出现。问题:类指针的大小如何总是已知?它是否具有固定大小(在32位机器上为32位,在64位机器上为64位)? - MTVclass A;
class B {
class A obj;
}
或者
class A;
class B {
class A *obj;
B() {
obj->some_method();
}
class A {
//definition
}
class B {
class A obj;
}
当你在默认析构函数的类中使用前向声明与std::unique_ptr
(例如,实现PIMPL惯用语)时,也会出现这种情况。
这个问题在这里得到了很好的解释:Forward declaration with unique_ptr?
template<typename T>
class
{
foo a;
foo b;
};
function(T a,int b)
{
. . . . .
}
这会带来一些问题,因为模板定义与类相关联,在这种情况下,函数的参数列表中出现错误,提示T未定义
,并且不允许使用不完整的类型
。如果您需要将模板用于多个实体,则必须在这些实体的定义之前重复使用此语句:
template<typename T>