如何修复"static assertion failed: template argument not an integral type"错误?

How to fix "static assertion failed: template argument not an integral type" error?

本文关键字:an not integral 错误 argument type template static 何修复 assertion failed      更新时间:2023-10-16

我想生成给定类型(T)的0和最大值之间的任何数字。为 int、short 、long 等生成数字没有问题,但我无法为 float 和 double 执行此操作。我收到此错误:"静态断言失败:模板参数不是整数类型"。

我的代码:

#include <iostream>
#include <limits>
#include <random>
template<class T>
T questGenerator()
{
    std::random_device rd;
    std::default_random_engine generator(rd());
    std::uniform_int_distribution<T> distribution(0, std::numeric_limits<T>::max());
    return distribution(generator);
}
int main()
{
    std::cout << questGenerator<float>();
}

这是我得到的一个输入和输出示例:

输入:

std::cout << generateQuest<short>() << std::endl;
std::cout << generateQuest<short>() << std::endl;
std::cout << (short)generateQuest<char>() << std::endl;
std::cout << (short)generateQuest<char>() << std::endl;
std::cout << generateQuest<float>() << std::endl;
std::cout << generateQuest<float>() << std::endl;

输出:

10105
5332
52
110
3.39889e+38
2.7026e+38

std::uniform_int_distribution<T>用于任何不同于shortintlonglong longunsigned shortunsigned intunsigned longunsigned long long T都是未定义的行为

您可能需要考虑std::uniform_real_distribution<T>

此外,每个线程有多个生成器通常是一个坏主意。你最好坚持使用对单个的引用。

相关文章: