Generate a random numbers class I have made class to setup a random number bases on &lt;random&gt;. It works fine, but I have doubt in std::default_random_engine mEngine{ std::random_device()() }; Did i implement it correctly? What is the best practice for random?

#include &lt;random&gt;
#include &lt;iostream&gt;

// for some compilers that's don't support nested templates with the same parameter
template &lt;typename T&gt;
auto dist() -&gt; typename std::enable_if&lt;std::is_integral&lt;T&gt;::value, std::uniform_int_distribution&lt;T&gt; &gt;::type;

template &lt;typename T&gt;
auto dist() -&gt; typename std::enable_if&lt;std::is_floating_point&lt;T&gt;::value, std::uniform_real_distribution&lt;T&gt; &gt;::type;

template&lt;typename T&gt;
class Random
{
public:
    Random(const T&amp; min, const T&amp; max)
        : mUnifomDistribution(min, max)
    {}
    Random(const Random&lt;T&gt;&amp;) = delete;
    Random(const Random&lt;T&gt;&amp;&amp;) = delete;
    Random&lt;T&gt;&amp; operator = (const Random&lt;T&gt;&amp;) = delete;
    T operator()()
    {
        return mUnifomDistribution(mEngine);
    }

private:
    std::default_random_engine mEngine{ std::random_device()() }; // &lt;-- here the doubt - is it seeding?
    //template &lt;typename T&gt;
    //static auto dist() -&gt; typename std::enable_if&lt;std::is_integral&lt;T&gt;::value, std::uniform_int_distribution&lt;T&gt; &gt;::type;

    //template &lt;typename T&gt;
    //static auto dist() -&gt; typename std::enable_if&lt;std::is_floating_point&lt;T&gt;::value, std::uniform_real_distribution&lt;T&gt; &gt;::type;

    using type = decltype(dist&lt;T&gt;());
    type mUnifomDistribution;
};

int main() 
{
    ::Random&lt;int&gt; getRandom(0, 9);
    for (int i = 0; i&lt;9; ++i)
        std::cout &lt;&lt; getRandom() &lt;&lt; '\n';
}
I have a few comments on this.
Don't attempt to nest templates with the same parameter
First, as you've already discovered, nested templates with the same parameter are a violation of the C++ language standard, whether or not your compiler complains.  (In fact, I would say it's broken if it does not complain.)
C++ standard, section 14.6.1:

A template-parameter shall not be redeclared within its scope (including nested scopes). A template-parameter shall not have the same name as the template name.

The definition of mUniformDistribution can be simpler
The code doesn't need a using statement.  The declaration can be made directly:
decltype(dist&lt;T&gt;()) mUniformDistribution;

(Also note that the existing code misspells &quot;Uniform&quot;)
The use of Random does not require a scope
The code in main refers to ::Random but that's really not necessary here.  It should just be Random.
Consider repeatability
To answer the question in your code, yes,
std::default_random_engine mEngine{ std::random_device()() };

that line of code does seed mEngine however, I'd suggest rethinking that feature.  If you were using this random number generator for, say a simulation, you might want to be able to duplicate the simulation exactly and not simply always run it with new random numbers.  To get the best of both worlds, you could keep your existing code, but eliminate the initialization of mEngine and add it instead to the constructors:
Random(const T&amp; min, const T&amp; max)
    : mEngine{}, 
      mUniformDistribution(min, max)
{}
Random(const T&amp; min, const T&amp; max, bool )
    : mEngine{ std::random_device()() }, 
      mUniformDistribution(min, max)
{}
// ...
std::default_random_engine mEngine;

Now if you construct using the first version, you'll get the default seed each time.  If you use the second constructor (with a dummy bool parameter) it will use a new seed each time.