1

我正在使用 Embarcadero RAD Studio XE C++ Builder。我在让我的 STL 映射正常工作时遇到了一点问题。

#ifndef BbTabManagerH
#define BbTabManagerH

#include "BbSeExplorer.h"
#include "BbTabPage.h"
    #include <map>

#define TAB_MANAGER_MAX_TABS 7

class TBbSeExplore;

typedef std::map<std::string, BbTabPage> TabPageMap;
typedef std::map<std::string, BbTabPage>::iterator TabPageMapIt;

我的问题在以下行:

typedef std::map<std::string, BbTabPage> TabPageMap;

这给了我一个编译器错误:

[BCC32 错误] BbTabManager.h(13): E2451 Undefined symbol 'BbTabPage' 完整解析器上下文 stdafx.h(229): #include ..\src** * \Gui\Utilities\BbTabPage.h BbTabPage.h(5) : #include ..\src* ** \Gui\Frames\BbSeExplorer.h BbSeExplorer.h(10): #include ..\src** * *\Gui\Utilities\BbTabManager.h

我觉得这很奇怪,我包含了“BbTabPage.h”,它声明了“BbTabPage”类,那么未定义的符号从何而来?

我尝试做这样的前向声明:

class BbTabPage;

但这似乎并没有太大的区别,只是它给了我更多的编译器错误。奇怪的是,如果我将其更改为指针:

typedef std::map<std::string, BbTabPage*> TabPageMap;

一切都编译得很好。

这个问题让我发疯,我一直试图找到几个小时的解决方案。类必须符合某种要求才能用作地图中的值吗?

4

1 回答 1

3

看起来像循环包含的问题

  • BbTabPage.h 包括 BbSeExplorer.h

  • BbSeExplorer.h 包括 BbTabManager.h

  • BbTabManager.h 包括 BbTabPage.h

因此,您第一次点击 typedefBbTabPage时尚未定义,因为来自部分处理的 BbTabPage.h 的包含保护阻止 BbTabManager.h 包含 BbTabPage.h。

答案是重新组织您的标题,使它们没有循环包含。如果两个类完全相互依赖,那么最好将它们放在同一个头文件中,这样您就可以更仔细地控制以什么顺序看到的内容。

于 2013-10-06T10:20:56.603 回答