Что может быть причиной ошибки компилятора в этом операторе для продвижения итератора? - PullRequest
1 голос
/ 15 января 2010

Следующая строка генерирует ошибку компилятора:

std::vector<int>::iterator blah = std::advance(instructions.begin(), x );

где я объявил:

std::vector<int> instructions;
int x;

Я получаю ошибку:

error C2440: 'initializing' : cannot convert from 'void' to 'std::_Vector_iterator<_Ty,_Alloc>'.

Какой элемент этого утверждения имеет тип void?

Ответы [ 5 ]

5 голосов
/ 15 января 2010

advance не возвращает расширенный итератор, он перемещает итератор, переданный в качестве параметра. Таким образом, ваш код должен читать:

std::vector<int>::iterator blah = instructions.begin();
advance(blah, x);
2 голосов
/ 15 января 2010

Не глядя на это, я предполагаю, что функция advance возвращает void, который вы присваиваете blah

try: advance(blah, x);, при условии, конечно, что вы инициализировали бла: blah = instructions.begin();

1 голос
/ 15 января 2010

cplusplus.com говорит мне, что std::advance возвращает void, отсюда и проблема.

1 голос
/ 15 января 2010

std::advance не возвращает итератор - вам нужно использовать его как:

std::vector<int>::iterator blah = instructions.begin();
advance(blah, x);

Или, поскольку у вектора в любом случае есть итераторы произвольного доступа:

std::vector<int>::iterator blah = instructions.begin()+x;
1 голос
/ 15 января 2010

Возвращаемое значение аванса является недействительным, а не vector<int>::iterator. Вместо этого он берет первый параметр по ссылке и увеличивает его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...