2011-07-21 27 views
17

tengo una clase de plantilla con una función miembro de plantillaLa especialización de la función miembro de plantilla en la clase de plantilla

template<class T> 
class A { 
public: 
    template<class CT> 
    CT function(); 
}; 

Ahora quiero especializar la función miembro de plantilla de 2 maneras. En primer lugar 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 lugar para el tipo bool:

template<class T> 
template<> 
bool A<T>::function<bool>() { 
    return false; 
} 

Así es como estoy tratando de probarlo:

int main() { 
    A<double> a; 
    bool b = a.function<bool>(); 
    double d = a.function<double>(); 
} 

Ahora gcc me da para 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 tengo que especializar A, si quiero especializarme en la función, ¿no? No quiero hacer eso, quiero que el tipo de la clase externa esté abierto ...

¿Es la respuesta definitiva: no es posible? ¿O hay alguna manera?

+0

duplicado Posible de http://stackoverflow.com/q/3040201/498253 – Tom

Respuesta

13

Sí, este es el problema:

error: enclosing class templates are not explicitly specialized 

No se pueden especializar un miembro sin también la clase especializada.

Lo que puede hacer es poner el código de function en una clase separada y especializado que, al igual basic_string depende de una clase separada char_traits. Entonces, el function no especializado puede llamar a un ayudante en la clase de rasgos.

6

Puede usar 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 :)

Cuestiones relacionadas