The problem is that you did not understand how the specialized specialization of class templates works.
Your specialization:
template<int J> struct test<int, J> {int j = J;};
does not create a template for which you need to pass only one int template parameter.
test<55> jj;
Instead, it creates a specialization template<class T, int I> struct testthat will be used when the template arguments in template<class T, int I> struct testcorrespond to the specialization, i.e. test<int,J>.
test<int,55> jj;
Here's a key quote from the standard:
, (, A<int, int, 1>) . . [ ]
  - nbsp;
, int T, I. , , , 44 int .
, , . (template<class T=int, int I=44> struct test), .
, , :
template <int I>
using test_int = test<int, I>;
, :
test_int<55> jj;
, test<int, I> , .