C++ 在全局级别实例化(C+;+;)

C++ 在全局级别实例化(C+;+;),c++,global-variables,instantiation,C++,Global Variables,Instantiation,我用下面的代码得到以下错误 expected constructor, destructor, or type conversion before '=' token -- #包括 #包括 福班{ }; 地图; map[“bar”]=Foo(); int main() { 返回0; } 在C++0x成为主流之前,我建议使用boost。填充地图就成了小菜一碟。以下是一个例子: std::map<std::string, Foo> mymap; ... int main() {

我用下面的代码得到以下错误

expected constructor, destructor, or type conversion before '=' token
--

#包括
#包括
福班{
};
地图;
map[“bar”]=Foo();
int main()
{
返回0;
}

在C++0x成为主流之前,我建议使用
boost
。填充
地图
就成了小菜一碟。以下是一个例子:

std::map<std::string, Foo> mymap;
...
int main()
{
  insert(mymap)
   ("First",  Foo(...))
   ("Second", Foo(...))
   ("Third",  Foo(...));
   ...
}
std::map mymap;
...
int main()
{
插入(mymap)
(“第一”,Foo(…)
(“第二”,Foo(…)
(“第三”,Foo(…);
...
}

在C++0x成为主流之前,我建议使用
boost
。填充
地图
就成了小菜一碟。以下是一个例子:

std::map<std::string, Foo> mymap;
...
int main()
{
  insert(mymap)
   ("First",  Foo(...))
   ("Second", Foo(...))
   ("Third",  Foo(...));
   ...
}
std::map mymap;
...
int main()
{
插入(mymap)
(“第一”,Foo(…)
(“第二”,Foo(…)
(“第三”,Foo(…);
...
}

看起来您需要的是一个静态初始值设定项。我建议你读一读。它说明了静态初始值设定项的使用以及它们的主要缺陷,静态初始化顺序。

看起来您想要的是静态初始值设定项。我建议你读一读。它说明了静态初始化器的使用以及它们的主要缺陷,静态初始化顺序。

正如您所看到的,简短的回答是:您不能这样做

我想你真正想要的是:

std::map<std::string, Foo> map;

int main()
{
    map["bar"] = Foo();
但是,现在您遇到了一个新问题,即不能保证在
\u helper\u obj
之前创建
map
。解决这一问题的一种方法是将它们结合起来:

namespace {
   struct StaticInitHelper : public std::map<std::string, Foo> {
       StaticInitHelper() { (*this)["bar"] = Foo(); }
   } map;
}
当然,这会使地图的使用复杂化

更新:

我忘了提到另一个选项,使用:

#包括
map map=boost::assign::map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);

不过,我找不到关于这在静态对象上是否安全的信息。

正如您所看到的,简短的回答是:您不能这样做

我想你真正想要的是:

std::map<std::string, Foo> map;

int main()
{
    map["bar"] = Foo();
但是,现在您遇到了一个新问题,即不能保证在
\u helper\u obj
之前创建
map
。解决这一问题的一种方法是将它们结合起来:

namespace {
   struct StaticInitHelper : public std::map<std::string, Foo> {
       StaticInitHelper() { (*this)["bar"] = Foo(); }
   } map;
}
当然,这会使地图的使用复杂化

更新:

我忘了提到另一个选项,使用:

#包括
map map=boost::assign::map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);

但是,我找不到关于在静态对象上是否安全的信息。

您的问题不是“在全局级别实例化”,而是“试图在全局级别执行语句”。抱歉,你不能这么做。你的问题不是“在全局级别实例化”,而是“试图在全局级别执行语句”。你不能这么做,对不起。我没有投你反对票,但我想我明白为什么你的回答不好。它没有解决这个问题。静态初始化和排序危险可能是他问题的答案的一部分,但你没有包括这个问题。C++中没有静态初始化器。全局变量由这些构造函数初始化。另外,链接的文章很糟糕,而且充满了非常糟糕的建议。好吧,我决不会反驳一个评价这么高的人(他们的评论中有语法错误),但我称之为胡说八道。C++ FAQS是一个备受尊敬的网站,它产生了一本受人尊敬的书。不,技术上C++中没有一个“静态初始化器”,但是有一个“第一次使用”的习语,它完成了同样的事情,如果OP试图用值初始化一个全局映射,那么这个成语可能对他有用。我没有投票给你,但是我想我明白为什么你的答案不是一个好答案。它没有解决这个问题。静态初始化和排序危险可能是他问题的答案的一部分,但你没有包括这个问题。C++中没有静态初始化器。全局变量由这些构造函数初始化。另外,链接的文章很糟糕,而且充满了非常糟糕的建议。好吧,我决不会反驳一个评价这么高的人(他们的评论中有语法错误),但我称之为胡说八道。C++ FAQS是一个备受尊敬的网站,它产生了一本受人尊敬的书。不,技术上C++中没有一个“静态初始化器”,但是有一个“第一次使用”的习语,它完成了同样的事情,如果OP试图用值初始化一个全局映射,那么这个成语可能对他有用。
namespace {
   struct StaticInitHelper {
       StaticInitHelper() { map["bar"] = Foo(); }
       std::map<std::string, Foo> map;
   } map_holder;
}

map_holder.map.find(...
#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);