我不明白为什么这个不能编译:
#include <SomeType.h> // has a namespace called SomeNamespace
class MyApplication;
int main(...)
{
...
MyApplication application;
...
}
class MyApplication : public SomeNamespace::SomeType {
...
};现在,我从g++ (Ubuntu4.4.3-4ubuntu5) 4.4.3得到了这个错误
../fix-protocol/main.cpp:44: error: aggregate ‘MyApplication application’ has incomplete type and cannot be defined发布于 2011-02-19 08:23:57
在main中,你正在实例化一个MyApplication类型的对象,它仍然是一个不完整的类型;你不能这样做,因为编译器还不知道它的任何信息(它需要知道它有多大,如果它有任何构造函数,等等)。
要解决您的问题,必须在实例化该类型的对象之前定义MyApplication。通常,您将类定义放在一个单独的头文件中,并带有它的名称,在任何需要它的文件中都将是#included。
相反,正向声明通常被用来打破循环依赖和其他类似的场景;它们所说的只是“有一个类名就是这样”,但它们创建了一个不完整的类型,所以它们只能用来声明其类型的变量,而不能用来定义它们。
发布于 2011-02-19 08:23:46
在实例化对象之前,必须完全定义类。MyApplication application;,您正在尝试实例化一个对象application,但是编译器并不知道MyApplication的组成,因为它是向前声明的。因此,将定义放在main()之前,并删除转发声明。
class MyApplication : public SomeNamespace::SomeType {
...
};
int main()
{
MyApplication application;
}发布于 2011-02-19 08:23:57
您需要将MyApplication的定义放在任何实例化之前。在上面的代码中,编译器不知道为application变量分配多少堆栈空间,因为它还没有看到MyApplication的定义。
https://stackoverflow.com/questions/5047938
复制相似问题