Integer bounds for generic

I'm working on a generic struct that's supposed to support all the standard integer types. As a part of the struct there's a configurable upper limit. I want to set that upper limit during construction to the integer type's maximum value.

It was suggested to me that the num crate (well, specifically the num-traits crate) could help me bound the generic type to integer types.

I have something along the lines of:

use num_traits as num;

struct Ids<T> {
  limit: T
}

impl<T: Sized + num::Bounded> Ids<T> {
  fn new() -> Result<Self, Error> {
    Ids { limit: T::max_value() }
  }

When I compile that it tells me that it expects an integer for limit, but it found "type parameter T" (in new()).

Is my assumption about that I should be able to do that wrong, or have I just not understood the syntax?

The provided code seems to work. Could you reconstruct the problematic case in playground?

Usually you get this error when you try to influence what type T has, but T is an argument, decided by the caller, so your code can't use any concrete type in its place.

extern crate num;

fn new<T: num::Bounded>() -> T {
    1_i32
}

i32 is bounded, T must be bounded, so why i32 isn't accepted? Because the function allows any T, and it'd be incorrect if called as e.g. new::<u8>() or if someone implemented Bounded on a String and called new::<String>() (nobody will, but Rust doesn't know that).