Как исправить C ++ предупреждение о неявном преобразовании? - PullRequest
0 голосов
/ 30 января 2019

Я только начинаю в C ++.

Я пытаюсь получить первые три символа строки 'str' и сравнить ее с известной строкой, скажем, 'knownString'.

Для этого я написал следующую строку кода:

if (str.substr (start, 3) == knownString)

где 'start'целое число, которое я объявил ранее.Но я продолжаю получать это предупреждение:

предупреждение: неявное преобразование изменяет подпись: 'int' на 'std :: __ cxx11 :: basic_string, ** **std :: allocator> :: size_type '(он же «unsigned int»)

Кто-нибудь знает, что я могу добавить, или я пропустил это утверждение, чтобы это исправить?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Вы можете:

Либо 1. сделать преобразование явным:

str.substr(static_cast<std::string::size_type>(start), 3)

, либо 2. не выполнить преобразование в первую очередь:

std::string::size_type start;

Или 3. попросить компилятор не предупреждать об этом:

g++ compilation arguments -Wno-sign-conversion

Я рекомендую вариант 2.

0 голосов
/ 30 января 2019

Это предупреждение вызывается переключателем -Wsign-conversion , который обнаруживает, что вы берете переменную со знаком, и преобразовывает ее в переменную без знака, что может изменить значение.

Это не делает это для положительных литералов, где преобразование, очевидно, не меняет значение, потому что это было бы бессмысленно и действительно раздражало.Вы получите его для отрицательного литерала, например -5.

(Технически это литерал 5 с примененным унарным оператором отрицания, а не «отрицательный литерал»!).

Для именованных переменных он не может реально предсказать, каким будет значение, так что из-за осторожности.

Вы должны сделать вашу переменную start иметь типsize_t.

...