使用类作为STL映射的值 - 未定义的符号

时间:2013-10-06 10:18:53

标签: c++ map stl std c++builder

我正在使用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未定义的符号'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;

一切都很好。

这个问题让我疯狂,我一直试图找到解决方案几个小时。一个类必须遵守哪些要求才能用作地图中的值?

1 个答案:

答案 0 :(得分:3)

看起来像圆形包含的问题

  • BbTabPage.h包含BbSeExplorer.h

  • BbSeExplorer.h包含BbTabManager.h

  • BbTabManager.h包含BbTabPage.h

因此,第一次点击typedef BbTabPage时尚未定义,因为部分处理的BbTabPage.h中的include guard会阻止BbTabManager.h包含BbTabPage.h。

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