vector <int>v (istream_iterator <int>(cin), istream_iterator <int>()); - PullRequest
0 голосов
/ 11 марта 2012
#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 ]

4 голосов
/ 11 марта 2012

Эта проблема известна как самый неприятный синтаксический анализ C ++ .

Попробуйте изменить первую строку на следующую (обратите внимание на дополнительные скобки):

vector<int> v((istream_iterator<int>(cin)), istream_iterator<int>());
1 голос
/ 11 марта 2012

Как указывает @Kyle Lutz, это самая неприятная проблема синтаксического анализа, которая также часто решается путем изменения инициализации на что-то вроде:

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

, что имеет тенденцию быть лучше понятым, чем "двойные скобки"обмануть».

0 голосов
/ 16 июля 2015

Здесь есть объявления указателя функции, используемые в качестве параметра функции:

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>());

мы добавляем () вокруг первого элемента, который сообщает компилятору, что это глагол, а не параметр, поэтомувторой элемент тоже должен быть глаголом.Вот и все.

0 голосов
/ 11 марта 2012

Если бы вы просто добавили одну дополнительную строку, вы могли бы избежать MVP, и ваш код, в частности, был бы намного более читабельным и менее повторяющимся.

istream_iterator<int> b(cin), e;
vector<int> v(b,e);
0 голосов
/ 11 марта 2012

Когда я пытаюсь его скомпилировать, единственные ошибки, которые я получаю, находятся в строке next , где жалуется, что v.begin() и v.end() недопустимы, потому что v не являетсяclass / struct / union (по очевидной причине, что, как уже отмечалось, вы столкнулись с самым неприятным анализом).

...