Похоже, кто-то поднял уровень предупреждений в ваших инструментах и превратил предупреждения в серьезные ошибки, приводящие к остановке компиляции. Это хорошо в большинстве случаев, особенно во время обучения, потому что вы больше не можете игнорировать предупреждения компилятора 1 .
Информация о позиции и размере, возвращаемая методами string
, беззнаковая. . В конце концов, какой смысл в строке отрицательной длины? Если вы посмотрите документацию для find_first_of
, вы увидите, что он не возвращает int
; он возвращает size_type
. С помощью чуть больше вы обнаружите, что size_type
- это целое число без знака того или иного типа, определенного реализацией библиотеки вашего инструмента разработки. Если вы go покопаетесь в заголовках реализации стандартной библиотеки, вы найдете фактический тип, представленный size_type
, но вам не нужно знать точный тип. Просто используйте size_type
и позвольте компилятору выяснить детали.
Итак ...
int pos = 0, last_pos = 0;
while ((pos = right_token.find_first_of(" ", last_pos)) != string::npos)
должно быть
string::size_type pos = 0, last_pos = 0;
while ((pos = right_token.find_first_of(" ", last_pos)) != string::npos)
1 Ошибки компилятора - это неверный синтаксис, плохая грамматика, из-за которых исходный код невозможно преобразовать в исполняемый код. Предупреждения компилятора - это синтаксически правильный код, но компилятор обеспокоен тем, что могут быть сомнительные logi c и программа не будет вести себя так, как вы ожидаете. Часто это правильно, и изучение предупреждения сэкономит вам время на отладку ошибки во время выполнения. Но иногда это предупреждение о том, с чем вы вряд ли столкнетесь. В этом конкретном случае вам потребуется ОГРОМНАЯ строка, вероятно, длиной в гигабайты, чтобы появилась ошибка logi c.