xutility 的错误(<chrono> <random> C++标准库)

Errors with xutility (<chrono> <random> C++ standard libraries)

本文关键字:gt lt C++ 标准 random chrono xutility 错误      更新时间:2023-10-16

我在使用标准和Microsoft Visual Studio 2013编写简单的随机数生成器时遇到问题。当我尝试编译时,它会抛出一堆与xutility文件相关的错误。当我试图使用BOOST库来完成同样的事情时,我遇到了一堆类似的错误,所以这可能是MSVC的问题。

#include <iostream>
#include <chrono>
#include <random>
using std::cout;
using std::endl;
auto seed = std::chrono::high_resolution_clock::now();
int main()
{
    std::uniform_int_distribution<> randNum(1, 6);
    cout << randNum(seed) << endl;
    return 0;
}

以下是它抛出的错误:

错误1错误C2039:"result_type":不是"std::chrono::time_point"e:\program files(x86)\microsoft visual studio 12.0\vc\include\xutility 3256 的成员

错误2错误C2146:语法错误:缺少";"标识符"_Ty1"之前的e:\program files(x86)\microsoft visual studio 12.0\vc\include\xutility 3256

错误3错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认的int e:\program files(x86)\microsoft visual studio 12.0\vc\include\xutility 3256

错误4错误C2065:"_Ty1":未声明的标识符e:\program files(x86)\microsoft visual studio 12.0\vc\include\xutility 3258

错误5错误C2070:"未知类型":操作数e:\program files(x86)\microsoft visual studio 12.0\vc\include\xutility 3258 的大小非法

错误6错误C2065:"_Ty1":未声明的标识符e:\program files(x86)\microsoft visual studio 12.0\vc\include\xutility 3259

错误7错误C2923:"std::_If":"_Ty1"不是参数"_Ty2"的有效模板类型参数e:\program files(x86)\microsoft visual studio 12.0\vc\include\xutility 3259

错误8错误C2955:"std::_If":类模板的使用需要模板参数列表e:\program files(x86)\microsoft visual studio 12.0\vc\include\xutility 3259

这是xutility的一段代码,它似乎引起了麻烦:

    // TEMPLATE CLASS _Rng_from_urng
template<class _Diff, class _Urng>
    class _Rng_from_urng
    {   // wrap a URNG as an RNG
public:
    typedef typename make_unsigned<_Diff>::type _Ty0;
    typedef typename _Urng::result_type _Ty1;
    typedef typename _If<sizeof (_Ty1) < sizeof (_Ty0),
        _Ty0, _Ty1>::type _Udiff;

在这一点之后,类有更多的代码,但错误发生在最后两行。

顺便说一句,我花了几个小时查询不同的搜索,试图找到答案,然后在这里发布,但没有可用的结果,尽管这很容易是我的不足。

谢谢!

在Sebastian的帮助下,以前的所有错误都得到了解决,但产生了一个新的错误:

修改代码:

    std::default_random_engine engine(seed);
    cout << randNum(engine) << endl;

错误:

错误1错误C2039:"generate":不是"std::chrono::time_point"e:\program files(x86)\microsoft visual studio 12.0\vc\include\random 1618 的成员

cout << randNum(seed) << endl;

这就是您现在使用分发的方式。您需要创建一个使用种子初始化的本地引擎,然后将引擎传递给分发的调用运算符。

std::default_random_engine engine(seed);
cout << randNum(engine) << endl;

有关更详细的示例,请参阅cppreference上的示例:

http://en.cppreference.com/w/cpp/numeric/random