我正在使用 VC 2010 并试图通过将随机定义放置在每个类实例的构造函数中,然后根据需要从那里调用来保持某些函数的开销和重复代码较低。我现在所拥有的,简化的是:
#include <random>
#include <Windows.h>
mt19937 eng(GetTickCount());
class Cycles {
int line;
normal_distribution<> rand_norm;
variate_generator<mt19937&,normal_distribution<>> r_norm;
public:
Cycles()
: rand_norm(0.85,0.05),
r_norm(eng,rand_norm) {
line=0;
}
}
不幸的是,这不起作用,我最终得到了这个错误:
\vc\include\random(513): 错误 C2248: 'std::tr1::_Ewrap<_Engine,_Tgt_type>::operator =' : 无法访问在类'std::tr1::_Ewrap<_Engine 中声明的私有成员, _Tgt_type>'
\vc\include\random(446) : 参见 'std::tr1::_Ewrap<_Engine,_Tgt_type>::operator =' 的声明
此诊断发生在编译器生成的函数 'std::tr1::variate_generator<_Engine,_Distrib> &std::tr1::variate_generator<_Engine,_Distrib>::operator =(const std::tr1::variate_generator<_Engine,_Distrib > &)'
我知道这些应该在打开构造函数之前初始化,否则会因为缺少默认构造函数而出错,但我不明白为什么会失败。我的 C++ fu 很生锈。
我看到的每个示例都显示分发器和生成器在调用它的函数中全局或本地初始化,这对我来说似乎很愚蠢,因为我有几个将使用 r_norm 的成员函数在紧密循环中调用。它严重未能通过气味测试。没有人知道我错过了什么吗?