C ++ TR1: Как правильно использовать равномерное распределение для генерации случайного числа в методе const? - PullRequest
1 голос
/ 15 ноября 2010

У меня есть простой метод const, который хочет сгенерировать случайное число

int Object::const_method() const {
    std::tr1::uniform_int<int> uni(0,100);
    // do some calculation
   return result;
}

Это приводит к вашей стандартной (если преобразуется) ошибке нарушения const

/ USR / Библиотека / GCC / x86_64-неизвестно-Linux-гну / 4.5.1 /../../../../ включают / C ++ / 4.5.1 / tr1 / random.tcc: 910: 4: ошибка: прохождение ‘const std :: tr1 :: mersenne_twister ’как аргумент« this » ‘тип результата станд :: tr1 :: mersenne_twister <_UIntType, __w, __n, __m, __r, __a, __u, __s, __b, __t, __c, __l> :: operator () () [with _UIntType = long unsigned int, int __w = 32, int __n = 624, int __m = 397, int __r = 31, _UIntType __a = 2567483615ul, int __u = 11, int __s = 7, _UIntType __b = 2636928640ul, int __t = 15, _UIntType __c = 4022730752ul, int __l = 18, result_type = long unsigned int] ’ отбрасывает квалификаторы

Это выполнимо без const_cast на this?

1 Ответ

1 голос
/ 15 ноября 2010

Сделайте ваш объект mersenne_twister изменчивым в вашем классе. Не видя весь ваш код (особенно часть do_something), мы не можем быть уверены, но я предполагаю, что у вас есть объект в вашем классе типа merseene_twister, который вы используете, функция которого сама по себе не является константной функцией , Это вызывает ошибку в вашем классе, потому что ваша const-функция вызывает функцию в merseen_twister, которая может изменить ее, нарушая вашу const-сигнатуру.

// I'm using this as an example.  Yours may differ
typedef std::mersenne_twister<unsigned int, 32, 624, 
    397, 31, 0x9908b0df, 11, 7, 0x9d2c5680, 
    15, 0xefc60000, 18> MerTwister;

class Object 
{
    public:

    int Object::const_method() const 
    {
       std::tr1::uniform_int<int> uni(0,100);

       // do some calculation using the MerTwister object
       return result;
    }


    private:
    mutable MerTwister twister;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...