template<class Int_T,class Integral,typename Best_Fit<Int_T>::type Min_Range, typename Best_Fit<Int_T>::type Max_Range> auto operator+(Integral left,const Int<Int_T,Min_Range,Max_Range>& right) ->Int<decltype(left + right.get_data())> { static_assert(std::is_integral<Integral>::value,"Non integral type is not allowed."); static_assert(std::is_integral<Int_T>::value,"Non integral type is not allowed."); auto data = left + right.get_data(); Int<decltype(left + right.get_data())> result(data); return result; } The point is that I don't think that those two static_assert*s* will ever be triggered - even if one tries too.
So what's the answer to this Q?
Best_FitandInt- whatever they are), but failsis_integral...Int<>,Best_Fit<>because anyone of those could trigger SFINAEIntegralhas a higher rank thanInt_T.