tengo este código¿Por qué es anulado por la especialización parcial en un argumento que no es el tipo de usar plantilla anidada parámetros
template<int N, bool C = true>
struct A;
template<int N>
struct A<N, !(N % 5)> {
/* ... */
};
// should work
A<25> a;
Es decir, para los números N
que son divisibles por 5
, el compilador debe utilizar el parcial especialización. Pero el compilador no aceptará esa especialización parcial, porque el Estándar requiere que rechace dicho código cuando un argumento sin tipo de una especialización parcial haga referencia a un parámetro y no sea simplemente un parámetro (como, A<N, N>
sería válido). Pero, ¿cuál es el motivo de hacerlo?
Tenga en cuenta que simplemente puedo cambiar el código para un ejemplo más prolijo y es válida
template<bool> struct wrap;
template<int N, typename = wrap<true> >
struct A;
template<int N>
struct A<N, wrap<!(N % 5)> > {
/* ... */
};
// should work
A<25> a;
Esto está bien porque no es un parámetro de tipo no más. ¿Pero cuál es la razón por la cual la especificación prohíbe la especialización parcial más directa?
Incluso esto no está permitido: http://www.ideone.com/Vxx0R ... Me pregunto qué sección del estándar lo deshabilita. §14.5.4/9 se aplica aquí también? – Nawaz
Esto es más o menos lo mismo que, ¿por qué no hay una especificación parcial de funciones cuando puedes simplemente envolverlas en una estructura? – Puppy
¿Por qué incluso está usando plantillas con este código? –