notaorb
notaorb

Reputation: 2180

Random number example from Stroustrup has compilation error

I'm using this random number example from Stroustrup C++ 4th Ed Page 1182. The compiler is reporting an error on the line with auto, stating that auto cannot be used with non-static members of classes. I'm confused on what the type of this bind results in. Does anyone know how to resolve the error so the random number generator can be used?

#include <random>
using namespace std;

class Rand_int {
public: // added
    Rand_int(int lo, int hi) : p{lo,hi} { }
    int operator()() const { return r(); }
private:
    uniform_int_distribution<>::param_type p;
    auto r = bind(uniform_int_distribution<>{p},default_random_engine{});
};

int main()
{
    Rand_int ri {0,10};
    int pz = ri();
    
    return 0;
}

Compilation error:

clang++ -Wall -std=c++11 -pedantic test252.cc && ./a.out
test252.cc:11:5: error: 'auto' not allowed in non-static class member
    auto r = bind(uniform_int_distribution<>{p},default_random_e...
    ^~~~

Upvotes: 4

Views: 148

Answers (1)

cigien
cigien

Reputation: 60228

You can't use auto for the type of a non-static member of a class, so the code example is wrong.

Instead, you can do:

class Rand_int {
  private:
    std::function<int()> r = bind(uniform_int_distribution<>{p},default_random_engine{});
  // ...
};

This converts the return type of std::bind to a void function returning an int, which is the desired behavior.

Here's a demo.

Upvotes: 2

Related Questions