#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'作为一个函数!惊人...
答案 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>());
我们在第一个元素周围添加()
,它告诉编译器它是动词,而不是参数,所以第二个元素也必须是动词。这就是全部。