Рассмотрим этот пример:
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
int main()
{
std::string sen = "abc def ghi jkl";
std::istringstream iss(sen);
std::vector<std::string> // declaration in question
vec(std::istream_iterator<std::string>(iss),
std::istream_iterator<std::string>());
std::copy(vec.begin(), vec.end(),
std::ostream_iterator<std::string>(std::cout, "\n"));
}
Компилятор выдает ошибку при вызове запроса std :: copy
для члена 'begin' в 'vec', который не является -class type ...
Я могу обойти ошибку следующим образом:
std::istream_iterator<std::string> it_begin(iss);
std::istream_iterator<std::string> it_end;
std::vector<std::string> vec(it_begin, it_end);
или заключив каждый параметр в круглые скобки, например:
std::vector<std::string>
vec((std::istream_iterator<std::string>(iss)),
(std::istream_iterator<std::string>()));
или даже с новой унифицированной инициализацией в C ++ 11:
std::vector<std::string> vec { /*begin*/, /*end*/ };
Почему компилятор анализирует объявление в примере как объявление функции? Я знаю о наиболее неприятном синтаксическом анализе, но я думал, что это происходит только с пустыми списками параметров. Мне также интересно, почему работает второй способ обхода.