当心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都不是一种类型,所以分析机制不会认为这是一个声明!

事情解决,时间不早,睡了!

 
原创粉丝点击