El problema es que no ha entendido cómo funciona la selección de una especialización de plantilla de clase.
Su especialización:
template<int J> struct test<int, J> {int j = J;};
no crea una plantilla para el que sólo tiene que pasar en un solo parámetro de plantilla int.
test<55> jj; // doesn't work because there's no template<int J> struct test
En cambio, lo que hace es crear una especialización de template<class T, int I> struct test
que se utiliza cuando los argumentos de plantilla a template<class T, int I> struct test
coinciden con la especialización, es decir test<int,J>
.
test<int,55> jj; // uses the specialization template<int J> struct test<int, J>
Aquí está la cita clave de la norma:
En un nombre de tipo que hace referencia a una especialización de plantilla de clase, (por ejemplo, A<int, int, 1>
) la lista de argumentos debe coincidir con el parámetro de plantilla lista de la plantilla primaria. Los argumentos de la plantilla de una especialización se deducen de los argumentos de la plantilla primaria.[énfasis añadido]
- 14.5.5.1 [temp.class.spec.match] p4
usted parece estar tratando de establecer int
como tipo predeterminado para T
mientras establece simultáneamente un valor predeterminado para I
. Creo que su intención es poder especificar un tipo y un valor, especificar solo un tipo y obtener 44 como valor predeterminado, o especificar solo un valor y obtener int como un tipo predeterminado.
Desafortunadamente, no conozco una forma de especificar los valores predeterminados independientes de esa manera. Puede especificar los valores predeterminados (template<class T=int, int I=44> struct test
) pero obtener el tipo predeterminado también requerirá aceptar el valor predeterminado.
Sin embargo, si usted está dispuesto a utilizar un segundo nombre, puede hacerlo:
template <int I>
using test_int = test<int, I>;
Esto crea una plantilla de alias tales que sólo tiene que especificar un valor:
test_int<55> jj;
Y esto terminará usando cualquier especialización que test<int, I>
pasa a resolver si hay una especialización explícita o si el compilador genera una implícita.
¿Podría vincular el mensaje de error? – Morwenn