错误 C2143。为啥 VC++ 找不到我的课程?

Posted

技术标签:

【中文标题】错误 C2143。为啥 VC++ 找不到我的课程?【英文标题】:error C2143. Why VC++ don't find my class?错误 C2143。为什么 VC++ 找不到我的课程? 【发布时间】:2011-01-13 23:08:05 【问题描述】:

我正在从事一个包含多个课程的项目。所有头文件都在“include”文件夹中,所有 src 文件在另一个文件夹中。但是在这一点上,缺少一个一直没有问题的类。

产生错误的代码是:

namespace render   
    class CSprite2D
       
        CTexture * m_texture;

错误是语法错误:缺少';'在'*'之前 所以我不知道为什么 VC++ 找不到我的课程。 VC++ 编译类的顺序非常奇怪:在尝试编译 Texture.cpp 之前检测到 sprite2D 中的错误。另外,CTexture 类已经进入项目,并且在创建 sprite2D 之前完美运行。

你能帮我找出一些错误吗?

*编辑:*它有效,解决方案是简单地转发声明纹理类(感谢 James 和 peenut)。但现在我的疑问是:如果我已经包含了纹理,为什么我需要转发声明纹理类?包含头文件还不够?

提前致谢。

【问题讨论】:

顺序无关紧要,您是否在该代码之前包含了头文件? 你有没有#include-ed 在你需要的地方找到正确的标题?标题相互递归包含有问题吗? 【参考方案1】:

只要声明它,你只使用指针:

namespace render
    class CTexture; //forward declaration  
    class CSprite2D
       
        CTexture * m_texture;

当然,正如 cmets 建议的那样:

不要忘记在 *.cpp 文件中包含所有必要的标头 使用前向声明来分解循环依赖(例如 class A B * b; ; class B A * a; )

编辑:提问者的编辑:

我已经包含了纹理,为什么我需要转发声明纹理类?

假设您有“sprite.hpp”、“texture.hpp”,而 CSprite2D 包含指向纹理的指针。如果没有前向声明,您必须始终在包含“sprite.hpp”之前包含“texture.hpp”。更糟糕的是,如果你的 CTexture 使用指向 CSprite2D 的指针,你别无选择,只能使用前向声明来避免循环依赖。

【讨论】:

【参考方案2】:

如果代码所在的头文件不包含任何最终包含 CTexture 定义的内容,那么即使其他地方知道,它也不知道 CTexture 是什么。

但是,由于您在这里只使用了一个指针,您可能只需要做一个前向声明并将头包含在 .cpp 文件中,其中 CTexture 的方法/数据用于避免循环头包含。

【讨论】:

以上是关于错误 C2143。为啥 VC++ 找不到我的课程?的主要内容,如果未能解决你的问题,请参考以下文章

找不到依赖程序集 Microsoft.VC90.CRT 错误

为啥我装了vc运行c++程序的时候老是说找不到include文件?

VC ++ WINAPI窗体:找不到标识符(C3861错误)

为啥我的 Laravel 模块中出现“找不到类”错误?

VC提示找不到dshow.h文件,添加DirextX 之后,为啥出现一堆问题? 急救!

我找不到我的链表的错误(为啥我的头指针在移动?)