我正在使用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”类,那么 undefined symbol 从何而来?

我试图做这样的前向声明:
class BbTabPage;

但这似乎并没有太大的区别,除了它给了我更多的编译器错误。奇怪的是,如果我将其更改为指针:
typedef std::map<std::string, BbTabPage*> TabPageMap;

一切都可以编译。

这个问题让我发疯,我已经尝试了好几个小时了。类必须符合某种要求才能用作 map 中的值?

最佳答案

似乎包含循环的问题

  • BbTabPage.h包括BbSeExplorer.h
  • BbSeExplorer.h包括BbTabManager.h
  • BbTabManager.h包括BbTabPage.h

  • 因此,您第一次键入typedef BbTabPage的操作尚未定义,因为来自已部分处理的BbTabPage.h的包含保护会阻止BbTabManager.h包含BbTabPage.h。

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

    07-24 09:35