当心C++编译器的分析机制
来源:互联网 发布:Logging python 编辑:程序博客网 时间:2024/04/30 15:27
我已经在in.txt中输入了一串整数:3 4 5 6 93
ifstream dataFile("in.txt");
list<int> data(istream_iterator<int>(dataFile),istream_iterator<int>());
以上这段代码的想法是将文件in.txt中的整型数据读入到链表data中,istream_iterator<int>(dataFile)指向文件的开始处,istream_iterator<int>()则指向了文件的结尾处。将内容通过区间构造函数传到list中。
在我的vc2005.net中可以编译,但是在调用 copy(data.begin(),data.end(),ostream_iterator<int>(cout," ")); 后,没有得到我想要的输出 :3 4 5 6 93 而是什么都没有输出!
这是为何?实际上list<int> data(istream_iterator<int>(dataFile),istream_iterator<int>());什么也没有做...!
让我们看清楚一点,仔细一点,再仔细一点!.....看出来了吗?实际上这里声明了一个函数:返回类型是list<int> 函数名称是data,有两个参数,istream_iterator<int>是第一个参数的类型,dataFile是参数名称,它两边的括号是多余的可以省略,第二人参数也是一个,只是没有提供参数名称.
这是由于C++的普遍规律导致的:尽可能地解释为函数声明!
再举个例子:class point{...};//假定有默认构造函数
point p();//如你所愿?
其实它没有声明为p的point.而是声明了一个名为 p的函数,该函数不带任何声明,并返回一个point类型.
这是一个避开这种分析机制的做法:
ifstream dataFile("in.txt");
istream_iterator<int> dataBegin(dataFile);
istream_iterator<int> dataEnd;
list<int> data(dataBegin,dataEnd);
因为在data的参数中,dataBegin和dataEnd都不是一种类型,所以分析机制不会认为这是一个声明!
事情解决,时间不早,睡了!
- 当心C++编译器的分析机制
- Effective STL 第六条 当心C++编译器最烦人的分析机制
- 当心编译器生成的隐含成员函数
- C++编译器最烦人的分析机制
- LCC编译器的源程序分析(1)C编译器的目标
- LCC编译器的源程序分析(1)C编译器的目标
- 编译器之词法分析c
- Freestanding C与交叉编译器的生成原理分析
- [转载]LCC编译器的源程序分析(1)C编译器的目标
- 当心多余的逗号
- 当心潜在的二义性
- 当心我们的葡萄
- 编译器的一些预处理机制
- C-编译器的设计
- C语言的编译器
- 简单的C编译器
- 分析编译器对C关键字的处理『跳过编译器的语法检查,完成很危险的操作』
- [C专家]分析C语言声明——只有编译器才会喜欢的语法
- 不写独立于容器类型的代码
- 关于获得MFC窗口其它类指针的方法
- 用empty检查是否为空
- 利用 UltraEdit 重新排版 XML 结构数据
- 区间成员函数优先于与之对应的单元素成员函数
- 当心C++编译器的分析机制
- AS常用代码集锦
- 用C#开发较完整的Windows任务管理器
- 慎重选择删除元素的方法
- 学ACE以及网络编程的参考读物
- [记录]调戏皮条客的短信实录
- MSSQL数据导入导出语句一览
- C#读写INI文件
- Top Five Reasons Why AJAX Is So Hard