C4800:'浮动':强制值为bool'true'或'false'(性能警告)

时间:2015-08-10 22:05:53

标签: c++

我知道之前已经问过这个问题,但我没有找到任何有希望的答案,而且案件与我的不同。

#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
#include <type_traits>

template<class getN>
getN getNum(std::string prompt, std::function<bool(getN)> condition, std::string error)
{
    std::cerr << prompt;
std::string strNum;
std::getline(std::cin, strNum);

try
{
    size_t pos;
    getN num;

    if (std::is_integral<getN>::value == true)
    {
        num = static_cast<getN>(stoi(strNum, std::addressof(pos)));
    }
    else
    {
        num = static_cast<getN>(stof(strNum, std::addressof(pos)));
    }

    if (all_of(strNum.begin() + pos, strNum.end(), [](char c) { return isspace(c); }) && condition(num))
    {
        return num;
    }
}
catch (std::exception) {}

std::cerr << error;
return getNum(prompt, condition, error);
}

void fillArray(float *arr, int size)
{
    std::cout << "\nFill the array:\n";
    for (int i = 0; i < size; i++)
    {
        std::cout << "arr[" << i + 1 << "]=";
        arr[i] = getNum<float>("", [](bool num) {return num != 0.0f; }, "Bad input! Try again: ");
    }
}

int main()
{
    int size;
    std::cout << "Size: ";
    std::cin >> size;

    float *arr = new float[size];

    fillArray(arr, size);

    delete[] arr;

    std::cin.ignore();
    std::cin.get();
    return 0;
}    

调用带有“int”的函数,就像最后一个语句一样,不会给我任何错误或警告,但是像fillArray函数一样用“float”调用它会把C4800抛给我。

1 个答案:

答案 0 :(得分:2)

您已声明getNum功能:

getN getNum(std::string prompt, std::function<bool(getN)> condition, std::string error)

取一个函数,返回bool的{​​{1}}值。

然后用它来调用它:

condition

传递arr[i] = getNum<float>("", [](float num) {return num; }, "Bad input! Try again: "); 返回值。虽然编译器可以将float转换为float,但它不如从函数中获取bool返回值有效。所以使用:

bool
相反,它不应该抱怨。

此外,将来,最好生成一个可以编译的COMPLETE程序(即,需要所有[](float num) -> bool {return num != 0.0f; } ,以及执行代码的#include函数)这样,有人可以只需要你的代码,编译它并进行一些微小的修改来修复问题,而不必猜测需要什么标题以及你打算如何使用你发布的东西。