简而言之,正如你所见,是:你不能那样做。
我想你真正想要的是这样的:
std::map<std::string, Foo> map;
int main()
{
map["bar"] = Foo();
如果你真的需要初始化执行main()
之前,你会经常看到的例子是这样的:
namespace {
struct StaticInitHelper {
StaticInitHelper() { map["bar"] = Foo(); }
} _helper_obj;
}
不过,现在您有一个新问题,即无法保证在_helper_obj
之前创建了map
。解决这个问题的一个方法是将它们合并:
namespace {
struct StaticInitHelper : public std::map<std::string, Foo> {
StaticInitHelper() { (*this)["bar"] = Foo(); }
} map;
}
但是,通常不推荐继承STL容器类。请注意,此示例隐藏了其他任何构造函数,并且STL基类没有虚拟析构函数。这被很多人认为是“黑客”,应该避免。
另一种替代方案是用std::map
定义类:
namespace {
struct StaticInitHelper {
StaticInitHelper() { map["bar"] = Foo(); }
std::map<std::string, Foo> map;
} map_holder;
}
map_holder.map.find(...
但当然这所有使用地图的复杂化。
更新:
我忘了提及的另一种选择,使用boost::assign
:
#include <boost/assign/list_of.hpp>
map<int,int> map = boost::assign::map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);
我无法找到这是否是安全的静态对象的信息,虽然。
你的问题不是“在全球范围内实例化”,而是“试图在全球范围内执行一个语句”。你不能这么做,对不起。 – 2009-10-26 23:17:02