2017-02-07 2 views
-4

в настоящее время компиляции мой файл set.cpp (мы должны были сделать этот файл на основе файла set.h и test_set.cpp) Используя г ++ компилятор, и я продолжать работать в этих предупреждений:сравнение между подписанными и беззнаковыми целыми выражениями?

set.cpp: In member function âvoid set::remove(const set::value_type&)â: 
set.cpp:30: warning: comparison between signed and unsigned integer expressions 
set.cpp: In member function âbool set::contains(const set::value_type&) constâ: 
set.cpp:50: warning: comparison between signed and unsigned integer expressions 
set.cpp: In function âset set_union(const set&, const set&)â: 
set.cpp:65: warning: comparison between signed and unsigned integer expressions 
set.cpp: In function âset set_intersection(const set&, const set&)â: 
set.cpp:76: warning: comparison between signed and unsigned integer expressions 
set.cpp: In function âset set_difference(const set&, const set&)â: 
set.cpp:90: warning: comparison between signed and unsigned integer expressions 
set.cpp: In function âbool is_subset(const set&, const set&)â: 
set.cpp:104: warning: comparison between signed and unsigned integer expressions 
set.cpp: In function âbool operator==(const set&, const set&)â: 
set.cpp:118: warning: comparison between signed and unsigned integer expressions 
    set.cpp: In function âstd::ostream& operator<<(std::ostream&, const set&)â: 
set.cpp:131: warning: comparison between signed and unsigned integer expressions 

Я не зная, что это значит, и задавался вопросом, как можно было бы это исправить.

+2

так ... что ваш вопрос? – RyanP

+0

эта линия линия нет. 131? –

+2

http://www.cplusplus.com/forum/beginner/207604/ этот чувак имеет очень похожий код на ваш (вплоть до комментариев в коде), возможно, вы можете задать их – TankorSmash

ответ

1

Не видя ваш файл заголовка, я предполагаю, что used определяется как unsigned int. В ваших циклах вы определяете i как int, что приводит к вашим предупреждениям.

Поскольку отрицательное значение в значении целого числа оценивается с большим положительным числом в целом без знака, сравнение этих двух может привести к неожиданным результатам. Быстрое решение состоит в том, чтобы изменить все виды использования i на unsigned int или на любой другой тип фактического типа для used.

2

Предупреждение вы получаете, скорее всего, поступающее от вашего для петель:

пример:

void set::remove(const value_type& entry) 
{ 
    for(int i = 0; i < used; i++) //the comparison in question is on this line 
    { 
     if(data[i] == entry) 
     { 
      data [i] = data [used - 1]; 
      used --; 
      return; 
     } 
    } 
} 

Оператор: i < used сравнивает i который является int и used, который я предполагаю, что это из беззнаковый тип.

Если вы должны были посмотреть на каждый номер строки, указанный в предупреждении, я считаю, что все они соответствовали циклам for в ваших функциях.

Самый простой способ исправить эти предупреждения - заменить int на любой тип, который вы используете для used.

Например, если used были и unsigned int ваши для петель станут:

void set::remove(const value_type& entry) 
{ 
    for(unsigned int i = 0; i < used; i++) 
    { 
     /*...*/ 
    } 
} 
Смежные вопросы

 Смежные вопросы