错误 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错误)