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

时间:2012-03-11 15:07:57

标签: c++ declaration

#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'作为一个函数!惊人...

5 个答案:

答案 0 :(得分:4)

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

尝试将第一行更改为以下内容(请注意额外的括号):

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

答案 1 :(得分:1)

正如@Kyle Lutz所指出的那样,这是最令人烦恼的解析问题,通常也可以通过将初始化更改为以下内容来解决:

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

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

答案 2 :(得分:0)

当我尝试编译它时,我得到的唯一错误是在 next 行,它抱怨v.begin()v.end()无效,因为{{ 1}}不是类/结构/联合(显而易见的原因,正如已经指出的那样,你遇到了最令人烦恼的解析)。

答案 3 :(得分:0)

如果您只是添加一行,那么您可以避免使用MVP,并且您的代码将会更加可读,并且重复性更低。

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

答案 4 :(得分: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>());

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