2011-07-21 11 views
17

Ho una classe template con una funzione di membro templatespecializzazione di funzione di membro basato su modelli in classe template

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

Ora voglio specializzare la funzione di membro template in 2 modi. In primo luogo per avere lo stesso tipo della classe:

template<class T> 
template<> // Line gcc gives an error for, see below 
T A<T>::function<T>() { 
    return (T)0.0; 
} 

In secondo luogo per il tipo bool:

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

Ecco come sto provando a testarlo:

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

Ora gcc mi dà per la linea indicata sopra:

error: invalid explicit specialization before ‘>’ token 
error: enclosing class templates are not explicitly specialize 

Quindi gcc mi sta dicendo che devo specializzarmi in A, se voglio specializzare la funzione, giusto? Non voglio farlo, voglio che il tipo di classe esterna sia aperto ...

È la risposta finale: non è possibile? O c'è un modo?

+0

Eventuali duplicati di http://stackoverflow.com/q/3040201/498253 – Tom

risposta

13

Sì, questo è il problema:

error: enclosing class templates are not explicitly specialized 

Non è possibile specializzarsi un membro anche senza specializzazione della classe.

Che cosa si può fare è mettere il codice da function in una classe separata e specializzati che, proprio come basic_string dipende da una classe char_traits separata. Quindi il function non specializzato può chiamare un helper nella classe dei tratti.

6

È possibile utilizzare l'overload se si modifica l'implementazione.

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; } 
}; 

Semplice e facile :)

Problemi correlati