【问题标题】:How to fix "static assertion failed: template argument not an integral type" error?如何修复“静态断言失败:模板参数不是整数类型”错误?
【发布时间】:2019-01-11 01:01:25
【问题描述】:

我想生成介于 0 和给定类型 (T) 的最大值之间的任何数字。为 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

【问题讨论】:

    标签: c++ random numbers


    【解决方案1】:

    std::uniform_int_distribution&lt;T&gt; 用于任何不同于shortintlonglong longunsigned intstd::uniform_int_distribution&lt;T&gt;未定义的行为unsigned longunsigned long long

    您可能需要考虑std::uniform_real_distribution&lt;T&gt;

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

    【讨论】:

      猜你喜欢
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 2021-11-18
      相关资源
      最近更新 更多