我得到的确切警告是
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的变量
orientation{
left = -1,
right = 1
};
警告意味着什么,以及摆脱它的最佳解决方案是什么?
答案 0 :(得分:13)
你的编译器不够聪明,不能考虑到side
只有left
和right
的两个选项,所以它认为这两个选项都不可能被执行。如果side
既不是left
也不是right
,则您的函数不会说明要返回的值。
答案 1 :(得分:7)
错误意味着如果side既不是左边也不是右边,你的函数不会返回一个值 - 任何一方声明不正确或你的枚举是。枚举应该定义为
enum orientation {left, right};
因此,请尝试将您的方向结构更改为。
答案 2 :(得分:6)
如果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...
}
答案 3 :(得分:4)
警告意味着可以通过您的方法而不返回任何显式值。使用您的代码:
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
,那么您不会返回任何内容。解决这个问题的常用方法是假设,例如,如果不是“左”,则总是假设“正确”:
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];
}
答案 4 :(得分:3)
你可以做某些事情,或者,因为在这种情况下,你真的以同样的方式回归......
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;
}
答案 5 :(得分:2)
要删除警告,请将第二个if
替换为else
:
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];
}
}
答案 6 :(得分:1)
正如其他人所说,问题是您的side
可能既不是left
也不是right
。
您可以修改您的功能以执行以下任何操作: