我正在使用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;
一切都很好。
这个问题让我疯狂,我一直试图找到解决方案几个小时。一个类必须遵守哪些要求才能用作地图中的值?
答案 0 :(得分:3)
看起来像圆形包含的问题
BbTabPage.h包含BbSeExplorer.h
BbSeExplorer.h包含BbTabManager.h
BbTabManager.h包含BbTabPage.h
因此,第一次点击typedef BbTabPage
时尚未定义,因为部分处理的BbTabPage.h中的include guard会阻止BbTabManager.h包含BbTabPage.h。
答案是重新组织标题,使它们没有循环包含。如果两个类完全相互依赖,那么最好将它们放在同一个头文件中,这样你就可以更仔细地控制以什么顺序看到的内容。