首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正向声明从不同命名空间中的类继承的子类

正向声明从不同命名空间中的类继承的子类
EN

Stack Overflow用户
提问于 2011-02-19 08:20:42
回答 5查看 1.7K关注 0票数 1

我不明白为什么这个不能编译:

代码语言:javascript
复制
#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得到了这个错误

代码语言:javascript
复制
../fix-protocol/main.cpp:44: error: aggregate ‘MyApplication application’ has incomplete type and cannot be defined
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-19 08:23:57

main中,你正在实例化一个MyApplication类型的对象,它仍然是一个不完整的类型;你不能这样做,因为编译器还不知道它的任何信息(它需要知道它有多大,如果它有任何构造函数,等等)。

要解决您的问题,必须在实例化该类型的对象之前定义MyApplication。通常,您将类定义放在一个单独的头文件中,并带有它的名称,在任何需要它的文件中都将是#included。

相反,正向声明通常被用来打破循环依赖和其他类似的场景;它们所说的只是“有一个类名就是这样”,但它们创建了一个不完整的类型,所以它们只能用来声明其类型的变量,而不能用来定义它们。

票数 4
EN

Stack Overflow用户

发布于 2011-02-19 08:23:46

在实例化对象之前,必须完全定义类。MyApplication application;,您正在尝试实例化一个对象application,但是编译器并不知道MyApplication的组成,因为它是向前声明的。因此,将定义放在main()之前,并删除转发声明。

代码语言:javascript
复制
class MyApplication : public SomeNamespace::SomeType {
    ...
};

int main()
{
    MyApplication application;
}
票数 3
EN

Stack Overflow用户

发布于 2011-02-19 08:23:57

您需要将MyApplication的定义放在任何实例化之前。在上面的代码中,编译器不知道为application变量分配多少堆栈空间,因为它还没有看到MyApplication的定义。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5047938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档