如何在Solaris环境下全局初始化std::map?编译报错求助
解决Solaris Studio下全局std::map初始化列表报错的问题
问题根源
Oracle Solaris Studio 12.6的C编译器对C11标准中全局对象的初始化列表支持不完善,无法识别std::map的列表初始化语法,导致编译报错。
可行解决方案
方案1:静态初始化函数+全局触发对象(最可靠)
通过全局对象的构造函数触发初始化函数,在程序启动时填充map,完全避开初始化列表的限制:
#include <iostream> #include <map> using namespace std; typedef map<int, string> mapType; // 声明全局map mapType myMap; // 初始化map的函数 void initMyMap() { myMap[1] = "One"; myMap[2] = "Two"; myMap[3] = "Three"; } // 利用全局对象的构造函数自动调用初始化函数 struct MapInitializer { MapInitializer() { initMyMap(); } } mapInitializer; // 全局实例,main执行前会构造 int main() { for (auto itr = myMap.begin(); itr != myMap.end(); ++itr) { cout << itr->first << " " << itr->second << '\n'; } return 0; }
方案2:数组存储键值对+遍历插入
如果偏好更接近原初始化列表的写法,可以先用数组存储键值对,再遍历插入到map中:
#include <iostream> #include <map> #include <utility> // 用于pair using namespace std; typedef map<int, string> mapType; mapType myMap; // 用数组存储初始化的键值对 const pair<int, string> initData[] = { make_pair(1, "One"), make_pair(2, "Two"), make_pair(3, "Three") }; void initMyMap() { const int dataSize = sizeof(initData) / sizeof(initData[0]); for (int i = 0; i < dataSize; ++i) { myMap.insert(initData[i]); } } struct MapInitializer { MapInitializer() { initMyMap(); } } mapInitializer; int main() { for (auto itr = myMap.begin(); itr != myMap.end(); ++itr) { cout << itr->first << " " << itr->second << '\n'; } return 0; }
方案3:尝试启用C++11编译选项
先确认编译时是否开启了C++11支持,Solaris Studio默认可能未启用,添加编译选项-std=c++11或-std=c++0x试试:
CC -std=c++11 your_source_file.cpp
注意:即使开启C++11,部分版本的Solaris Studio仍可能不支持全局map的列表初始化,若此方案无效,优先选择前两种。
内容的提问来源于stack exchange,提问作者RandomGuy
相关产品推荐
相关产品推荐

