c++ - respuestas - estadística elemental johnson r
Especialización de la función miembro con plantilla en la clase con plantilla. (2)
Tengo una clase con plantilla con una función miembro con plantilla
template<class T>
class A {
public:
template<class CT>
CT function();
};
Ahora quiero especializar la función miembro con plantilla de 2 maneras. Primero por tener el mismo tipo que la clase:
template<class T>
template<> // Line gcc gives an error for, see below
T A<T>::function<T>() {
return (T)0.0;
}
Segundo para el tipo bool:
template<class T>
template<>
bool A<T>::function<bool>() {
return false;
}
Aquí es cómo estoy tratando de probarlo:
int main() {
A<double> a;
bool b = a.function<bool>();
double d = a.function<double>();
}
Ahora gcc me da por la línea marcada arriba:
error: invalid explicit specialization before ‘>’ token
error: enclosing class templates are not explicitly specialize
Entonces, gcc me está diciendo que debo especializar A, si quiero especializar la función, ¿verdad? No quiero hacer eso, quiero que el tipo de la clase externa esté abierto ...
¿Es la respuesta final: no es posible? ¿O hay una manera?
Puede utilizar la sobrecarga, si cambia la implementación.
template <typename T>
class Foo
{
public:
template <typename CT>
CT function() { return helper((CT*)0); }
private:
template <typename CT>
CT helper(CT*);
T helper(T*) { return (T)0.0; }
bool helper(bool*) { return false; }
};
Simple y fácil :)
Sí, este es el problema:
error: enclosing class templates are not explicitly specialized
No puedes especializar a un miembro sin especializarte también en la clase.
Lo que puede hacer es poner el código de la function
en una clase separada y especializarse que, al igual que basic_string, depende de una clase separada char_traits. Entonces, la función no especializada puede llamar a un ayudante en la clase de rasgos.