Najpierw dla kontekstu, trochę kodu:
// choose_base.h
using namespace boost;
class Movement
{
public:
Movement( set<int>& proxies, int num );
void initSetting( int ini );
void sortByTimeAndPrint( WriteGroupingSchedule& out );
protected:
int _num;
set<int>& _proxies;
kreutzer1986 _rng;
lognormal_distribution<kreutzer1986> _lognormal;
/** Uniform distribution between 0 and num-1 */
uniform_int<kreutzer1986> _uni;
/* Uniform distribution between 0 and 1 */
uniform_01<kreutzer1986> _uni01;
typedef pair<double,int> Pair;
vector<vector<Pair> > _in_group;
};
// choose_base.cc
#include "choose_base.h"
using namespace boost;
Movement::Movement( set<int>& proxies, int num )
: _num( num )
, _proxies( proxies )
, _rng()
, _lognormal( _rng, 1.0, 0.5 )
, _uni( _rng, 0, _num-1 )
, _uni01( _rng )
{
_rng.seed( ::time(NULL) );
}
Co to za ciekawa budowa konstruktora...? Jeżeli np. _uni01 jest polem typu uniform_01<kreutzer1986>, to co oznacza _uni01(_rng)?
Niestety taki kod daje błąd "no matching function for call to ..." dla wszystkich trzech pól (_lognormal, _uni, _uni01). Próbuję poprawić ten kod, ale nie wiem co w tym miejscu programista miał na myśli... Czy chciał mieć 3 pola (int, double, double), które miałyby przypisane liczby wygenerowane przez te 3 kolejne funkcje losowe? Czy jeżeli przeniosę tą inicjalizację do konstruktora, dodam gettery i settery, to będzie to...?