vendredi 7 août 2020

Random number generation: compilation errors

I'm trying to adapt an example from Stroustrup C++ 4th Ed Page 1182, to call a function from operator()() vs the bind. Unfortunately, I'm getting a number of compilation errors. The code that worked before is // commented out. Does anyone know how to resolve the errors?

#include <iostream>
#include <random>
#include <map>
#include <functional>
using namespace std;

class rand_int {
public:
    rand_int(int lo, int hi) : p{lo,hi}, re{rd()} {}
//    int operator()() const { return r(); }
    int operator()() const { return
        uniform_int_distribution<>{p}(re); }
private:
    uniform_int_distribution<>::param_type p;
    random_device rd;
    default_random_engine re;
//    function<int()> r = bind(uniform_int_distribution<>{p}, re);
};

int main()
{
    map<int,int> m;
    rand_int ri{0,9};
    for (int i=0; i < 100; ++i) {
        m[ri()]++;
    }

    for (map<int,int>::iterator it = m.begin();
         it != m.end(); ++it)
        cout << it->first << ", " << it->second << '\n';

    return 0;
}

Compilation:

clang++ -Wall -std=c++11 -pedantic test252.cc && ./a.out
In file included from test252.cc:2:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/random:49:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/random.h:35:
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/uniform_int_dist.h:243:25: error: 
      no matching function for call to object of type 'const
      std::linear_congruential_engine<unsigned long, 16807, 0, 2147483647>'
              __ret = __uctype(__urng()) - __urngmin;
                               ^~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/uniform_int_dist.h:166:24: note: 
      in instantiation of function template specialization
      'std::uniform_int_distribution<int>::operator()<const
      std::linear_congruential_engine<unsigned long, 16807, 0, 2147483647> >'
      requested here
        { return this->operator()(__urng, _M_param); }
                       ^
test252.cc:12:35: note: in instantiation of function template specialization
      'std::uniform_int_distribution<int>::operator()<const
      std::linear_congruential_engine<unsigned long, 16807, 0, 2147483647> >'
      requested here
            uniform_int_distribution<>{p}(re); }
                                         ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/random.h:323:7: note: 
      candidate function not viable: 'this' argument has type 'const
      std::linear_congruential_engine<unsigned long, 16807, 0, 2147483647>', but
      method is not marked const
      operator()()
      ^

Aucun commentaire:

Enregistrer un commentaire