目前正在编译我的set.cpp文件(我们必须根据set.h文件和test_set.cpp创建该文件)使用g ++编译器,我一直遇到这些警告:
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
我不确定这些是什么意思,并且想知道如何解决这个问题。
答案 0 :(得分:2)
您获得的警告很可能来自您的for循环:
示例:
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
你的for循环将成为:
void set::remove(const value_type& entry)
{
for(unsigned int i = 0; i < used; i++)
{
/*...*/
}
}
答案 1 :(得分:1)
如果没有看到您的头文件,我假设used
被定义为unsigned int
。在您的循环中,您将i
定义为int
,从而导致您的警告。
因为有符号整数中的负值在无符号整数中求值为大的正数,因此比较这两者可能会导致意外结果。快速解决方案是将i
的所有用途更改为unsigned int
或used
使用的实际类型。