警告C4800:'int':强制值为bool'true'或'false'

时间:2018-02-23 08:30:27

标签: c++ templates

我编写了一个模板函数,它将int32,bool和int16作为输入。 但是对于布尔来说,我收到了这个警告。任何想法,我该如何解决。

template<class T>
void GameControl::assignValues(char *gaff, T &output)
{
   output = T(atoi(gaff));
}

函数调用如下:

int32 intout;
assignValues("1234", intout);
bool boolout;
assignValues("1234", boolout);

任何人都可以告诉我,如何摆脱警告?

编辑: 这有效,但不确定后果。我只是压制了警告。

#pragma warning( push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop )

2 个答案:

答案 0 :(得分:3)

您的第一份工作是将功能参数列表更改为const char* gaff,因为标准C ++不允许const char[N]衰减到char*。讽刺的是,你的编译器没有发出诊断信息,但却抱怨这个可疑的演员!

对于该警告,您可以使用

强制解决问题
output = static_cast<T>(atoi(gaff));

然后,大多数编译器会假设您知道自己在做什么。如果您仍然收到警告,那么专门化 bool案例的模板函数;一个解决方案,总的来说,我认为我更喜欢(除了关闭该特定功能的警告的实用方法):

template<>
void assignValues(const char *gaff, bool &output)
{
   output = atoi(gaff) != 0;
}

答案 1 :(得分:0)

您可以完全专门化bool的功能模板:

template<>
void GameControl::assignValues<bool>(char *gaff, boot &output)
{
   output = !!atoi(gaff);
}