![](/img/trans.png)
[英]What does “warning: not all control paths return a value” mean? (C++)
[英]What does “warning: not all control paths return a value” mean? (C++)
我得到的確切警告是
warning C4715: 'hand::show' : not all control paths return a value
和hand :: show是
std::ostream& hand::show(std::ostream& os) const
{
if(side == left)
{
return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
}
if(side == right)
{
return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
}
}
其中side是類型方向的變量
orientation{
left = -1,
right = 1
};
該警告是什么意思,擺脫該警告的最佳解決方案是什么?
您的編譯器不夠聰明,無法考慮到side
的僅有兩個選項為left
和right
,因此它認為不可能執行兩個return語句。 當side
既不left
也不right
,您的函數不說要返回哪個值。
該錯誤意味着如果side既不左也不右,則您的函數將不會返回值-任一側聲明不正確,或者您的枚舉是正確的。 枚舉應定義為
enum orientation {left, right};
因此,嘗試將定向結構更改為該定向結構。
如果side
不是left
或right
,則返回值是不確定的。
盡管orientation
是一個只有兩個值的枚舉(現在),但由於以下任何原因,它仍然可以具有不同的值:
side
可能是未初始化的,所以它可能是既不left
也不right
side
分配了另一個值,例如*((int*)&side) = 2
可能的解決方案包括:
if
替換為else
。 更改為:
if(side == left) { return ...; } else if(side == right) { return ...; } else { ...handle error... }
警告表示可以在不返回任何顯式值的情況下遍歷您的方法。 使用您的代碼:
std::ostream& hand::show(std::ostream& os) const
{
if(side == left)
{
return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
}
if(side == right)
{
return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
}
}
如果side != left
和side != right
,那么您什么也不返回。 解決此問題的常用方法是假設,例如,如果不是“ left”,則始終假設“ right”:
std::ostream& hand::show(std::ostream& os) const
{
if(side == left)
{
return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
}
return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
}
您可以按照說的去做,或者,因為在這種情況下,您實際上是通過兩種方式返回相同的內容...
std::ostream& hand::show(std::ostream& os) const
{
if(side == left)
{
os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
}
else
{
os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
}
return os;
}
要消除警告, if
用else
替換第二個if
:
std::ostream& hand::show(std::ostream& os) const
{
if(side == left)
{
return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
}
else
{
return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
}
}
正如其他人所暗示的那樣,問題是您的side
可能既不left
也不right
。
您可以修改函數以執行以下任一操作:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.