2017-02-07 11 views
-4

がg ++コンパイラを使用して(私たちはset.hファイルとtest_set.cppに基づいて、そのファイルを作成しなければならなかった)、私はこれらの警告に実行し続ける:符号付き整数式と符号なし整数式の比較現在、私の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

ヘッダーファイルが表示されていない場合、usedunsigned intと定義されています。ループでは、iintと定義し、警告につながります。

符号付き整数の負の値は、符号なし整数の大きな正の数を評価するため、この2つを比較すると予期しない結果が生じる可能性があります。迅速な解決方法は、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は私がであると仮定するとしていますintusedあるiを比較しています符号なしの型。

警告で指定された各行番号を調べると、それらはすべて関数のforループに対応すると思います。

これらの警告を修正する最も簡単な方法は、usedに使用しているタイプをintに置き換えることです。例えば

usedであった場合とunsigned intあなたのループがなるために:

void set::remove(const value_type& entry) 
{ 
    for(unsigned int i = 0; i < used; i++) 
    { 
     /*...*/ 
    } 
} 
関連する問題