我正在申请2个winforms:Form1.h和TrackEdit.h。它们都在同一名称空间中(“ParkCleanUp2”)。
从Form1中我调用此代码:
ParkCleanUp2::TrackEdit^ te;
它给了我这些错误:
Error 24 error C2039: 'TrackEdit' : is not a member of 'ParkCleanUp2' (TrackEdit.cpp) c:\users\-joey\documents\visual studio 2010\projects\park cleanup 2\park cleanup 2\Form1.h 2332
Error 25 error C2065: 'TrackEdit' : undeclared identifier (TrackEdit.cpp) c:\users\-joey\documents\visual studio 2010\projects\park cleanup 2\park cleanup 2\Form1.h 2332
Error 26 error C2065: 'te' : undeclared identifier (TrackEdit.cpp) c:\users\-joey\documents\visual studio 2010\projects\park cleanup 2\park cleanup 2\Form1.h 2332
但是,如果我去TrackEdit.h它会告诉我:
namespace ParkCleanUp2 {
//Some namespae includes
public ref class TrackEdit : public System::Windows::Forms::Form
所以我想知道为什么它给了我错误“'TrackEdit':不是'ParkCleanUp2'的成员”以及它为什么要查看TrackEdit.cpp文件,而我包括.h文件。
我发现奇怪的,也许重要的是,当我在TrackEdit.h中评论#include "Form1.h
行时,它只是完美的,但是在TrackEdit.h中我不能调用Form1的函数(比如选中)我希望实现的列表框中的项目。
答案 0 :(得分:2)
看来你们每个#include
都有Form1.h和TrackEdit.h。相反,有一个前向声明,只包含TrackEdit中的Form1.h。 cpp ,反之亦然。
双包含不起作用,因为你有两个类引用另一个。每个类都需要了解另一个类才能定义自己。既然你拥有的是完整的类定义,那么你就有了一个循环定义。相反,前向声明提供了足够的编译器知道“好的,有一个具有该名称的类,这就是我所知道的”,并且循环依赖性得到了解决。
(另外:当您编辑问题时,您删除了最重要的句子:“所以基本上Form1.h包括TrackEdit.h,其中包括Form1.h”。这种模式很少是正确的。如果你看到自己在做什么那,提供更多的前向声明。)
这样的事情:
Form1.h:
namespace ParkCleanUp2 {
ref class TrackEdit;
public ref class Form1 {
TrackEdit^ track;
};
}
TrackEdit.h:
namespace ParkCleanUp2 {
ref class Form1;
public ref class TrackEdit {
Form1^ parentForm;
};
}
Form1.cpp和TrackEdit.cpp:
#include "Form1.h"
#include "TrackEdit.h"