簡而言之,正如你所見,是:你不能那樣做。
我想你真正想要的是這樣的:
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