2011-06-02 96 views
0

我已经在全球范围内声明了以下地图并试图在全球范围内填充。全球填充地图

1: typedef std::map<unsigned short,std::pair<char,std::string>> DeviceTypeList; 
    2: DeviceTypeList g_DeviceTypeList; 
    3: g_DeviceTypeList.insert(std::make_pair ((unsigned short)SINGLE_CELL_CAMERA, 
    std::make_pair('B',"Single Cell Camera"))); 

它显示错误等错误C2143:语法错误:缺少 ';'之前'。'在第2行。

1我是否做错了
2.为什么我们不能在全局初始化地图。

回答

4

编译器可能会被第1行的>>弄糊涂(因为它看起来像是一个移位操作符)。尝试在里面插入空格:

typedef std::map<unsigned short,std::pair<char,std::string> > DeviceTypeList; 

[更新]

见弗拉德拉扎连科对为什么这不会真正解决您的问题发表评论。最简单的解决方法是将这个工具包装在一个对象中,在构造函数中初始化它,然后在全局范围声明一个。 (但如果你可以避免它,因为全局变量是邪恶的......)

+4

不,这不会解决它。应使用C++ 0x中的初始化程序列表或构造函数中的继承类填充基础。您不能在全局范围内执行任意函数,只能执行全局对象或初始化器的构造函数。 – 2011-06-02 03:19:33

+0

@Vlad:我停止阅读语法错误...好点。 – Nemo 2011-06-02 03:24:03

+0

@Vlad你应该使用这个在构造函数中继承的类填充基类的意思 – 2011-06-02 03:25:50

2

只有声明和定义可以在全局范围内,而对map :: insert()的调用不是其中之一。

由于您在模板中使用>>,所以编译器必须足够新,以支持C++ 0x。

尝试的C++ 0x初始化语法则:

typedef std::map<unsigned short, std::pair<char,std::string>> DeviceTypeList; 
DeviceTypeList g_DeviceTypeList = { 
       {(unsigned short)SINGLE_CELL_CAMERA, {'B',"Single Cell Camera"}} 
      }; 

测试:https://ideone.com/t4MAZ

虽然诊断表明它是MSVS,其不具有的C++ 0x初始化截至2010年,所以尽量升压初始化语法来代替:

typedef std::map<unsigned short, std::pair<char,std::string> > DeviceTypeList; 
DeviceTypeList g_DeviceTypeList = 
      boost::assign::map_list_of((unsigned short)SINGLE_CELL_CAMERA, 
             std::make_pair('B',"Single Cell Camera")); 

测试:https://ideone.com/KB0vV

+0

即使这可行,它也不会告诉OP为什么他的代码被破坏了。 – 2011-06-02 03:27:55

+0

@Billy ONeal:编辑 – Cubbi 2011-06-02 03:44:08

+0

我正在使用Vs 2008和C++ 0x不支持。 – 2011-06-02 03:48:43