Я использую 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> &) '
Я понимаю, что они должны быть инициализированы до открытия конструктора, иначе произойдет ошибка из-за отсутствия конструктора по умолчанию, но я не понимаю, почему это не удается. Мой С ++ фу довольно ржавый.
Каждый пример, который я видел, показывает, что распределитель и генератор инициализируются глобально или локально в вызывающей его функции, что мне кажется глупым, поскольку у меня есть несколько функций-членов, которые будут использовать r_norm, которые вызываются в узком цикле , Это плохо проходит тест на запах. Неужели никто не знает, что мне не хватает?