Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 警告C4800:&x27;int';:强制值为bool';正确';或';假';_C++_Templates - Fatal编程技术网

C++ 警告C4800:&x27;int';:强制值为bool';正确';或';假';

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

我已经编写了一个模板函数,它将int32、bool和int16作为输入。 然而,对于布尔,我得到了这个警告。任何想法,我如何解决它

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;
}