initializer_list的问题

sildtfine1982 2016-03-07 08:54:20
在看C++ primer plus(第六版),看到16章,总的来说STL把我搞得有点晕,实例太多了,根本有点抓不住要点,只是一个例子一个例子的输出来看看,总觉得不像前面学类,继承,虚函数时概念那么清晰。
今天碰到讲initializer_list的实例,照着书上的内容输下来,不过输完,很多地方就报错了。
主要一点,“不允许使用'{....}'对"std::initializer_list"类型的对象进行初始化”,想请教一下,我错在什么地方。

代码如下
#include<iostream>
#include<initializer_list>

double sum(std::initializer_list<double> il);
double average(const std::initializer_list<double> &ril);

int main()
{
using std::cout;

cout<<"List 1: sum= "<<sum({2,3,4})//这里有问题
<<",ave = "<<average({2,3,4})<<'\n';//这里也有问题,主要是构造函数初始化的问题。
std::initializer_list<double> dl={1.1,2.2,3.3,4.4,5.5};//这里也有问题
cout<<"List 2:sum= "<<sum(dl)
<<", ave = "<<average(dl)<<'\n';
dl={16.0,25.0,36.0,40.0,64.0};
cout<<"List 3:sum="<<sum(dl)
<<",ave= "<<average(dl)<<'\n';
return 0;
}

double sum(std::initializer_list<double> il)
{
double tot=0;
for(auto p=il.begin();p!=il.end();p++)
tot +=*p;
return tot;
}

double average(const std::initializer_list<double> & ril)
{
double tot=0;
int n=ril.size();
double ave=0.0;
if(n>0)
{
for(auto p=ril.begin();p!=ril.end();p++)
tot+=*p;
ave=tot/n;
}
return ave;
}
...全文
514 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 5 楼 woaiweixia 的回复:
我用的是VS2010,程序没有到实际编译运行那一步,所以没有报错信息。 只是在“{”下面有红色的小标式,提示信息就是“不允许使用'{....}'对"std::initializer_list"类型的对象进行初始化”(13行) 我运行了一下,报错内容如下: “ 1>------ 已启动生成: 项目: ilist, 配置: Debug Win32 ------ 1>生成启动时间为 2016/3/8 6:24:31。 1>PrepareForBuild: 1> 正在创建目录“G:\IM\Visual Studio 2010\Projects\ilist\Debug\”。 1>InitializeBuildStatus: 1> 正在创建“Debug\ilist.unsuccessfulbuild”,因为已指定“AlwaysCreate”。 1>ClCompile: 1> ilist.cpp 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(11): error C2143: 语法错误 : 缺少“)”(在“{”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(11): error C2660: “sum”: 函数不接受 0 个参数 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(11): error C2143: 语法错误 : 缺少“;”(在“{”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(11): error C2143: 语法错误 : 缺少“;”(在“}”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(11): error C2059: 语法错误:“)” 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2143: 语法错误 : 缺少“;”(在“<<”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2143: 语法错误 : 缺少“)”(在“{”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2143: 语法错误 : 缺少“;”(在“{”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2143: 语法错误 : 缺少“;”(在“}”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2059: 语法错误:“)” 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2143: 语法错误 : 缺少“;”(在“<<”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(13): error C2552: “dl”: 不能用初始值设定项列表初始化非聚合 1> “std::initializer_list<_Elem>”: 不聚合带私有或受保护的数据成员的类型 1> with 1> [ 1> _Elem=double 1> ] 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(16): error C2059: 语法错误:“{” 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(16): error C2143: 语法错误 : 缺少“;”(在“{”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(16): error C2143: 语法错误 : 缺少“;”(在“}”的前面) 1> 1>生成失败。 1> 1>已用时间 00:00:00.87 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== ” [quote=引用 1 楼 dustpg 的回复:] 还以为initializer_list就是一个语法糖,原来还能单独用。 不过vs2015代码编译正常。
如果dustpg回复无误的话,那可能是我的编译器的问题了。[/quote] VS支持C++11特性表 https://msdn.microsoft.com/en-US/library/hh567368(v=vs.140).aspx VS2010是不支持 Initializer lists的,直接换最新版的VS
fefe82 2016-03-08
  • 打赏
  • 举报
回复
引用 5 楼 woaiweixia 的回复:
我用的是VS2010,程序没有到实际编译运行那一步,所以没有报错信息。 只是在“{”下面有红色的小标式,提示信息就是“不允许使用'{....}'对"std::initializer_list"类型的对象进行初始化”(13行) 我运行了一下,报错内容如下: “ 1>------ 已启动生成: 项目: ilist, 配置: Debug Win32 ------ 1>生成启动时间为 2016/3/8 6:24:31。 1>PrepareForBuild: 1> 正在创建目录“G:\IM\Visual Studio 2010\Projects\ilist\Debug\”。 1>InitializeBuildStatus: 1> 正在创建“Debug\ilist.unsuccessfulbuild”,因为已指定“AlwaysCreate”。 1>ClCompile: 1> ilist.cpp 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(11): error C2143: 语法错误 : 缺少“)”(在“{”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(11): error C2660: “sum”: 函数不接受 0 个参数 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(11): error C2143: 语法错误 : 缺少“;”(在“{”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(11): error C2143: 语法错误 : 缺少“;”(在“}”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(11): error C2059: 语法错误:“)” 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2143: 语法错误 : 缺少“;”(在“<<”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2143: 语法错误 : 缺少“)”(在“{”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2143: 语法错误 : 缺少“;”(在“{”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2143: 语法错误 : 缺少“;”(在“}”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2059: 语法错误:“)” 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2143: 语法错误 : 缺少“;”(在“<<”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(13): error C2552: “dl”: 不能用初始值设定项列表初始化非聚合 1> “std::initializer_list<_Elem>”: 不聚合带私有或受保护的数据成员的类型 1> with 1> [ 1> _Elem=double 1> ] 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(16): error C2059: 语法错误:“{” 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(16): error C2143: 语法错误 : 缺少“;”(在“{”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(16): error C2143: 语法错误 : 缺少“;”(在“}”的前面) 1> 1>生成失败。 1> 1>已用时间 00:00:00.87 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== ” [quote=引用 1 楼 dustpg 的回复:] 还以为initializer_list就是一个语法糖,原来还能单独用。 不过vs2015代码编译正常。
如果dustpg回复无误的话,那可能是我的编译器的问题了。[/quote] 新标准 11 年才出来,你拿 10 年的编译器来试,出错也不奇怪了 。
sildtfine1982 2016-03-08
  • 打赏
  • 举报
回复
我用的是VS2010,程序没有到实际编译运行那一步,所以没有报错信息。 只是在“{”下面有红色的小标式,提示信息就是“不允许使用'{....}'对"std::initializer_list"类型的对象进行初始化”(13行) 我运行了一下,报错内容如下: “ 1>------ 已启动生成: 项目: ilist, 配置: Debug Win32 ------ 1>生成启动时间为 2016/3/8 6:24:31。 1>PrepareForBuild: 1> 正在创建目录“G:\IM\Visual Studio 2010\Projects\ilist\Debug\”。 1>InitializeBuildStatus: 1> 正在创建“Debug\ilist.unsuccessfulbuild”,因为已指定“AlwaysCreate”。 1>ClCompile: 1> ilist.cpp 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(11): error C2143: 语法错误 : 缺少“)”(在“{”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(11): error C2660: “sum”: 函数不接受 0 个参数 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(11): error C2143: 语法错误 : 缺少“;”(在“{”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(11): error C2143: 语法错误 : 缺少“;”(在“}”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(11): error C2059: 语法错误:“)” 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2143: 语法错误 : 缺少“;”(在“<<”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2143: 语法错误 : 缺少“)”(在“{”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2143: 语法错误 : 缺少“;”(在“{”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2143: 语法错误 : 缺少“;”(在“}”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2059: 语法错误:“)” 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(12): error C2143: 语法错误 : 缺少“;”(在“<<”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(13): error C2552: “dl”: 不能用初始值设定项列表初始化非聚合 1> “std::initializer_list<_Elem>”: 不聚合带私有或受保护的数据成员的类型 1> with 1> [ 1> _Elem=double 1> ] 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(16): error C2059: 语法错误:“{” 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(16): error C2143: 语法错误 : 缺少“;”(在“{”的前面) 1>g:\im\visual studio 2010\projects\ilist\ilist\ilist.cpp(16): error C2143: 语法错误 : 缺少“;”(在“}”的前面) 1> 1>生成失败。 1> 1>已用时间 00:00:00.87 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== ”
引用 1 楼 dustpg 的回复:
还以为initializer_list就是一个语法糖,原来还能单独用。 不过vs2015代码编译正常。
如果dustpg回复无误的话,那可能是我的编译器的问题了。
hznat 2016-03-08
  • 打赏
  • 举报
回复
你应该把报错信息帖出来。。因为你的问题,别人重现不了。。那就是怎么可能。怎么会这样。肯定是你哪里弄错了。。自然别人也解决不了你的实际问题。。
ri_aje 2016-03-08
  • 打赏
  • 举报
回复
试了一下,clang 3.6 可以编译,目测编译器太烂造成的错误。
iyomumx 2016-03-07
  • 打赏
  • 举报
回复
编译器是什么?你可能需要更新的编译器。
dustpg 2016-03-07
  • 打赏
  • 举报
回复
还以为initializer_list就是一个语法糖,原来还能单独用。 不过vs2015代码编译正常。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧