Il problema è che non hai capito come funziona la specializzazione del modello di classe.
tua specializzazione:
template<int J> struct test<int, J> {int j = J;};
non crea un modello per il quale si dispone solo di passare in un unico parametro di modello int.
test<55> jj; // doesn't work because there's no template<int J> struct test
Invece ciò che fa è creare una specializzazione di template<class T, int I> struct test
che sarà utilizzato quando gli argomenti di template per template<class T, int I> struct test
corrispondono alla specializzazione, vale a dire test<int,J>
.
test<int,55> jj; // uses the specialization template<int J> struct test<int, J>
Ecco la citazione chiave dalla norma:
In un nome di tipo che si riferisce ad una specializzazione modello di classe, (ad esempio, A<int, int, 1>
) la lista degli argomenti deve corrispondere al parametro di template elenco di il modello principale. Gli argomenti del modello di una specializzazione vengono dedotti dagli argomenti del modello principale.[enfasi aggiunta]
- 14.5.5.1 [temp.class.spec.match] p4
Sembra che tu stia tentando di impostare int
come un tipo predefinito per T
mentre contemporaneamente si imposta un indipendente valore predefinito per I
. Penso che il tuo intento sia di essere in grado di specificare un tipo e un valore, specificare solo un tipo e ottenere 44 come valore predefinito, o specificare solo un valore e ottenere int come un tipo predefinito.
Purtroppo non conosco un modo per specificare valori predefiniti indipendenti come quello. È possibile specificare i valori predefiniti (template<class T=int, int I=44> struct test
) ma per ottenere il tipo predefinito sarà necessario accettare anche il valore predefinito.
Tuttavia, se siete disposti a utilizzare un secondo nome allora si può fare:
template <int I>
using test_int = test<int, I>;
Questo crea un modello alias tali che basta specificare un valore:
test_int<55> jj;
E questo finirà per usare qualunque specializzazione test<int, I>
capita di stabilire se c'è una specializzazione esplicita o il compilatore ne genera uno implicito.
Potresti collegare il messaggio di errore? – Morwenn