c++ - resueltos - estadistica elemental solucionario
EspecializaciĆ³n parcial de la funciĆ³n miembro (1)
Las plantillas de funciones solo se pueden especializar por completo, no parcialmente.
Está utilizando el hecho de que las funciones miembro de las plantillas de clases son en sí mismas plantillas de funciones, por lo que esta regla aún se aplica.
En cuanto a su edición: las siguientes cosas pueden ser explícitamente (es decir, completamente) especializadas, desde 14.7.3 / 1:
Una especialización explícita de cualquiera de los siguientes:
- plantilla de función
- plantilla de clase
- función miembro de una plantilla de clase
- miembro de datos estáticos de una plantilla de clase
- clase de miembro de una plantilla de clase
- Enumeración de miembro de una plantilla de clase
- Plantilla de clase de miembro de una clase o plantilla de clase
- plantilla de función miembro de una plantilla de clase o clase
puede ser declarado por una declaración introducida por la
template<>;
He enfatizado las dos afirmaciones que se aplican a su caso. En ausencia de otras disposiciones explícitas, esas entidades no pueden ser especializadas en parte.
Posible duplicado:
Error "uso no válido de tipo incompleto" con especialización de plantilla parcial
¿Por qué es que puedo hacer esto?
template <typename T>
struct A
{
void foo(int);
};
template <>
void A<int>::foo(int)
{
}
pero no esto:
template <typename> struct C {};
template <typename T>
struct A
{
void foo(int);
};
template <typename T>
void A<C<T> >::foo(int)
{
}
Para el segundo caso, GCC da el siguiente error:
test.cpp:10:23: error: invalid use of incomplete type ''struct A<C<T> >''
test.cpp:4:8: error: declaration of ''struct A<C<T> >''
EDITAR :
Al explicar por qué el segundo ejemplo no está permitido, tenga en cuenta que hacer que el miembro funcione también como plantilla no tiene ningún efecto sobre qué ejemplo funciona y cuál no. Es decir, esto todavía funciona:
template <typename T>
struct A
{
template <typename U>
void foo(U);
};
template <>
template <typename U>
void A<int>::foo(U)
{
}
pero esto no:
template <typename> struct C {};
template <typename T>
struct A
{
template <typename U>
void foo(U);
};
template <typename T>
template <typename U>
void A<C<T> >::foo(U)
{
}
Por lo tanto, la razón no puede ser que las plantillas de funciones solo puedan estar completamente especializadas, porque el tercer ejemplo no es una especialización completa (el parámetro de la plantilla U
todavía está allí) y, sin embargo, funciona.