2011-07-21 5 views
17

J'ai une classe avec une fonction templated membre basé sur un modèle La spécialisation de la fonction membre en classe basé sur un modèle basé sur un modèle

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

Maintenant, je veux me spécialiser la fonction membre de 2 façons basé sur un modèle. Tout d'abord pour avoir le même type que la classe:

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

deuxième pour le type bool:

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

Voici comment je suis en train de le tester:

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

Maintenant gcc me donne pour la ligne marquée ci-dessus:

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

Alors gcc me dit, que je dois spécialiser A, si je veux spécialiser la fonction, non? Je ne veux pas faire cela, je veux que le type de la classe externe soit ouvert ...

Est-ce la réponse finale: ce n'est pas possible? Ou y a-t-il un moyen?

+0

double possible de http://stackoverflow.com/q/3040201/498253 – Tom

Répondre

13

Oui, c'est le problème:

error: enclosing class templates are not explicitly specialized 

Vous ne pouvez pas spécialiser un membre sans se spécialiser aussi la classe.

Qu'est-ce que vous pouvez faire est de mettre le code de function dans une catégorie distincte et spécialisée qui, tout comme basic_string dépend d'une classe char_traits séparée. Ensuite, function non spécialisé peut appeler un assistant dans la classe de traits.

6

Vous pouvez utiliser la surcharge si vous modifiez l'implémentation.

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 et facile :)

Questions connexes