2012-03-11 90 views
0
#include <iostream> 
#include <vector> 
#include <iterator> 
#include <algorithm> 
using namespace std; 

int main() 
{ 
    vector<int> v(istream_iterator<int>(cin), istream_iterator<int>()); //Compilation error?! 
    copy(v.begin(), v.end(), ostream_iterator<int>(cout, "\n")); 

    return 0; 
} 

为什么该行出错? 我知道编译器'v'作为一个函数!令人惊叹的...vector <int> v(istream_iterator <int>(cin),istream_iterator <int>());

+6

这将是很好,如果你能告诉我们什么是真正的错误是你越来越...... – Bart 2012-03-11 15:11:20

+3

什么是问题? – jalf 2012-03-11 15:14:12

回答

4

这个问题被称为C++的most vexing parse

尝试改变第一线以下(注意额外的括号):

vector<int> v((istream_iterator<int>(cin)), istream_iterator<int>()); 
1

正如@Kyle卢茨规定,这是最令人头痛的解析问题,那也往往通过改变初始化解决例如:

vector<int> v=vector<int> (istream_iterator<int>(cin), istream_iterator<int>()); 

这比“双括号技巧”更容易理解。

0

当我尝试编译它,唯一的错误,我得到的是对未来,在那里抱怨v.begin()v.end()是无效的,因为v是不是一类/结构/联合(为明显因为如前所述,你遇到了最令人头疼的解析)。

0

如果您只需添加一行,您可以避免使用MVP,而且您的代码可以更具可读性,而且不会重复。

istream_iterator<int> b(cin), e; 
vector<int> v(b,e); 
0

这里有用作函数参数的函数指针声明:

int f(int (*funa)()); 
int f(int funa()); 
int f(int());//The parameter name can be omitted, such as the function declaration int g(double p); is equal to int g(double); 

所以,看你的问题:

vector<int> v(istream_iterator<int>(cin), istream_iterator<int>()); 

是的,是的,我们知道istream_iterator<int>(cin)istream_iterator<int>类型参数。 但是,第二个参数是我们遇到的问题:istream_iterator<int>()可以理解为指向返回istream_iterator<int>且没有参数的函数的指针。这使编译器感到困惑,v可能是函数声明或动词定义。如果第二个参数不是函数指针,v是一个动词定义。

我们可以通过两种方式解决您的问题,第一,你可以声明迭代器,然后在v使用它们:

istream_iterator<int> dataBegin(cin); 
istream_iterator<int> dataEnd; 
vector<int> v(dataBegin, dataEnd); 

解决它的第二种方法是:

vector<int> v((istream_iterator<int>(cin)), istream_iterator<int>()); 

我们围绕第一个元素添加(),它告诉编译器它是一个动词,而不是一个参数,所以第二个元素也必须是一个动词。就这样。

相关问题