窗体头文件中的“错误 C2653:系统不是类或命名空间名称”,Visual C++
Posted
技术标签:
【中文标题】窗体头文件中的“错误 C2653:系统不是类或命名空间名称”,Visual C++【英文标题】:"error C2653: System is not a class or a namespace name" in Form header file, Visual C++ 【发布时间】:2013-04-02 11:40:11 【问题描述】:我之前关于同一个项目的问题:one 和 two。没有必要阅读它们;只知道我正在尝试在 Visual C++ 项目中使用本机 C++ SDK。这比我最初想象的要复杂得多,但是这个关于Extending a native C++ project with managed code 的网站已经帮助了我很多。
根据最后一个链接的说明,我已向我的本地 C++ 项目添加了一个表单,该项目已自动将项目转换为 CLR 项目。不过,只有 MainForm.cpp
和 Interface.cpp
(允许本地 C++ 代码创建和显示 MainForm 的文件)使用 /clr
标志编译;其他文件保持原生。
我现在遇到的问题是,Visual Studio 似乎无法识别 MainForm.h
中使用的任何 CLR 内容。因此,在以下几行中:
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
System
这个词总是带有红色下划线,并带有相应的错误:
error C2653: 'System' is not a class or a namespace name
对于每一行。
它也不能识别单词gcnew
和其他应该在 CLR 中毫不费力地工作的东西。
谁能告诉我我做错了什么?我的猜测是它非常小。一些我忘记更改的标志,缺少参考或类似的东西,但我无法弄清楚它是什么。
【问题讨论】:
你在哪里包含MainForm.h
?如果你将它包含在任何未用/clr
编译的翻译单元(即*.cpp)中,那么编译器当然会抱怨它,因为namespace System
和gcnew
不是标准 C++ 的一部分。
我把它包含在Interface.h
中。 Interface.cpp
是用 /clr
编译的,但正如我帖子中的第三个链接所说,这应该可以。
好的,你在哪里包含Interface.h
?由于您在Interface.h
中包含MainForm.h
,因此您也可以在包含Interface.h
的任何位置间接包含它。也许你应该只将它包含在Interface.cpp
中并在Interface.h
中使用前向声明
哇哦,原来如此!我在Interface.h
中包含MainForm.h
而不是Interface.cpp
。这在教程中没有提到,但是当你考虑它时它是合乎逻辑的......非常感谢。请将此作为答案发布,以便我接受并投票。 ;)
【参考方案1】:
您在哪里包括MainForm.h
- 直接和间接?
如果您在Interface.h
中包含MainForm.h
,您也可以在包含Interface.h
的任何位置间接包含它。这意味着,如果您随后将Interface.h
包含在任何未使用/clr
编译的翻译单元(即*.cpp)中,那么编译器当然会抱怨它,因为namespace System
和gcnew
不是一部分标准 C++。
因此,您应该只在Interface.cpp
中包含MainForm.h
,并在Interface.h
中使用前向声明。
【讨论】:
以上是关于窗体头文件中的“错误 C2653:系统不是类或命名空间名称”,Visual C++的主要内容,如果未能解决你的问题,请参考以下文章