C++ 警告C4800:&x27;int';:强制值为bool';正确';或';假';
我已经编写了一个模板函数,它将int32、bool和int16作为输入。 然而,对于布尔,我得到了这个警告。任何想法,我如何解决它C++ 警告C4800:&x27;int';:强制值为bool';正确';或';假';,c++,templates,C++,Templates,我已经编写了一个模板函数,它将int32、bool和int16作为输入。 然而,对于布尔,我得到了这个警告。任何想法,我如何解决它 template<class T> void GameControl::assignValues(char *gaff, T &output) { output = T(atoi(gaff)); } 谁能告诉我,如何摆脱这个警告 编辑: 这是可行的,但不确定后果如何。我只是抑制了警告 #pragma warning( push ) #pr
template<class T>
void GameControl::assignValues(char *gaff, T &output)
{
output = T(atoi(gaff));
}
谁能告诉我,如何摆脱这个警告
编辑:
这是可行的,但不确定后果如何。我只是抑制了警告
#pragma warning( push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop )
您可以完全专门化
bool
的函数模板:
template<>
void GameControl::assignValues<bool>(char *gaff, boot &output)
{
output = !!atoi(gaff);
}
模板
void GameControl::赋值(char*gaff、引导和输出)
{
输出=!!atoi(间隙);
}
<代码> > p>您的第一项工作是将函数参数列表更改为<代码> const char * gAF< <代码>,因为标准C++不允许将<代码> const char [n] < /C> >改为<代码> char */COD>。具有讽刺意味的是,您的编译器没有发出诊断,而是抱怨可疑的强制转换
对于该警告,您可以使用
output = static_cast<T>(atoi(gaff));
可能专门用于bool
的函数?在一个不相关的注释中,通常不建议使用atoi
函数,因为无法区分有效输入“0”
和导致返回0
的无效输入。我建议使用or。为什么不返回一个值,而不使用输出“参数”?您的代码可以读取int23 intout=assignValues(“1234”)代码>基于@juanchopanza的评论,对于bool
它将是bool boolout=assignValues(“1234”)!=0;代码>这只是我为这个问题创建的一个伪函数,原始函数已经返回了一个值,并且是不同的,但是只有这个功能导致了这个问题。我只是想避免代码重复我尝试了你的解决方案,但没有成功,得到了同样的结果warning@YashKapoor:该死的编译器!我已经明确地添加了专业化。试试看。对不起,糟糕,我只试了第一部分。我知道,我只是想避免代码重复。这只是一个演示功能。实际函数的大小稍微大一点。这确实解决了这个问题,但现在代码重复了,我想避免这种情况。可能吗?你说的代码重复是什么意思?这种情况仅适用于T=bool
。对于T
的所有其他值(例如:int
),将使用主模板。如果我在模板函数中修改了代码的功能,那么我也会将其复制粘贴到bool模块中。这就是我想要避免的。好吧,如果其他基于铸造的方法仍然显示警告,我建议单独(C4800
)。谢谢,我想这是一个更好的解决方案。我将抑制警告,如果它没有按预期执行,那么我将编写一个单独的函数。
output = static_cast<T>(atoi(gaff));
template<>
void assignValues(const char *gaff, bool &output)
{
output = atoi(gaff) != 0;
}