我无法正常编译代码。这是我的错误:
警告C4018:'> =':签名/无符号不匹配
void Player::HasteCap()
{
if (sWorld->getBoolConfig(CONFIG_PLAYER_HASTECAP_ENABLE))
return;
bool hasInstantHasteCap = (GetFloatValue(UNIT_FIELD_BASEATTACKTIME + 0) == 1
|| GetFloatValue(UNIT_FIELD_BASEATTACKTIME + 1) == 1
|| GetFloatValue(UNIT_FIELD_BASEATTACKTIME + 2) == 1
|| GetFloatValue(UNIT_MOD_CAST_SPEED) == 0);
if (m_baseRatingValue[CR_HASTE_MELEE] > sWorld->getIntConfig(CONFIG_PLAYER_HASTECAP_LIMIT))
{
SetFloatValue(UNIT_MOD_CAST_SPEED, 0);
SetFloatValue(UNIT_FIELD_BASEATTACKTIME + BASE_ATTACK, 1);
SetFloatValue(UNIT_FIELD_BASEATTACKTIME + OFF_ATTACK, 1);
SetFloatValue(UNIT_FIELD_BASEATTACKTIME + RANGED_ATTACK, 1);
}
else if (hasInstantHasteCap && m_baseRatingValue[CR_HASTE_MELEE] < sWorld->getIntConfig(CONFIG_PLAYER_HASTECAP_LIMIT))
{
SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f);
SetRegularAttackTime();
ApplyCastTimePercentMod(m_baseRatingValue[CR_HASTE_SPELL] * GetRatingMultiplier(CR_HASTE_SPELL), true);
if (GetShapeshiftForm())
{
SpellShapeshiftEntry const* ssEntry = sSpellShapeshiftStore.LookupEntry(GetShapeshiftForm());
if (ssEntry && ssEntry->attackSpeed)
{
SetAttackTime(BASE_ATTACK, ssEntry->attackSpeed);
SetAttackTime(OFF_ATTACK, ssEntry->attackSpeed);
SetAttackTime(RANGED_ATTACK, BASE_ATTACK_TIME);
}
}
}
if (CanModifyStats())
{
UpdateDamagePhysical(BASE_ATTACK);
UpdateDamagePhysical(OFF_ATTACK);
UpdateDamagePhysical(RANGED_ATTACK);
}
}
答案 0 :(得分:6)
您要比较的两个值的有符号/无符号性质应该相同,否则一个用于比较,另一个用于比较,这可能会导致意外结果。
最好确保您所比较的内容属于同一类型,但是:
如果您知道哪个值可以安全投射,请明确投射该值。在您的情况下,将签名值作为无符号值。
e.g。
unsigned int val1 = someunsignedvalue;
int val2 = somesignedvalue;
if (val1 > (unsigned int) val2) {
/* do stuff */
}
答案 1 :(得分:3)
这些警告不是错误。通常,尽管有警告,代码仍应编译。但是,如果您指定“将警告视为错误”编译器选项,则编译器在生成任何警告(或错误)时将无法编译。
要解决该警告,可以将逻辑运算符的一个无符号边强制转换为int。
答案 2 :(得分:1)
您发布的代码不包含相关成员/函数的定义,但编译器可能是正确的。
您期望得到什么样的答案?
要么修复问题(更改成员/函数/执行C样式转换/执行static_cast&lt; ...&gt;等,以便比较两边的“签名”匹配),或者禁用此警告合适的#pragma