我在使用标准和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:&#39; result_type&#39; :不是&#39; std :: chrono :: time_point&#39;的成员e:\ program files(x86)\ microsoft visual studio 12.0 \ vc \ include \ xutility 3256
错误2错误C2146:语法错误:缺少&#39 ;;&#39;在标识符&#39; _Ty1&#39;之前e:\ program files(x86)\ microsoft visual studio 12.0 \ vc \ include \ xutility 3256
错误3错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int e:\ program files(x86)\ microsoft visual studio 12.0 \ vc \ include \ xutility 3256
错误4错误C2065:&#39; _Ty1&#39; :未声明的标识符e:\ program files(x86)\ microsoft visual studio 12.0 \ vc \ include \ xutility 3258
错误5错误C2070:&#39; unknown-type&#39 ;:非法sizeof操作数e:\ program files(x86)\ microsoft visual studio 12.0 \ vc \ include \ xutility 3258
错误6错误C2065:&#39; _Ty1&#39; :未声明的标识符e:\ program files(x86)\ microsoft visual studio 12.0 \ vc \ include \ xutility 3259
错误7错误C2923:&#39; std :: _ If&#39; :&#39; _Ty1&#39;不是参数&#39; _Ty2&#39;的有效模板类型参数。 e:\ program files(x86)\ microsoft visual studio 12.0 \ vc \ include \ xutility 3259
错误8错误C2955:&#39; std :: _如果&#39; :使用类模板需要模板参数列表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;
在此之后,该类有更多代码,但错误发生在最后两行。
顺便说一句,我花了几个小时查询不同的搜索,试着找到答案,然后在这里发布没有可用的结果,尽管这很可能是我的不足之处。
谢谢!
使用Sebastion的帮助,之前的所有错误都已解决,但是已生成新的错误:
修改后的代码:
std::default_random_engine engine(seed);
cout << randNum(engine) << endl;
错误:
错误1错误C2039:&#39;生成&#39; :不是&#39; std :: chrono :: time_point&#39;的成员e:\ program files(x86)\ microsoft visual studio 12.0 \ vc \ include \ random 1618
答案 0 :(得分:0)
cout << randNum(seed) << endl;
现在你是如何使用发行版的。您需要创建一个使用种子初始化的本地引擎,然后将引擎传递给分发的调用操作符。
std::default_random_engine engine(seed);
cout << randNum(engine) << endl;
有关更详细的示例,请参阅cppreference上的示例: