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);