2010-06-17 16 views
0

J'ai essayé d'implémenter une fonction qui nécessite des spécialisations de modèle partielles et qui est retombée dans la structure statique, et j'ai un certain nombre de problèmes.Problème avec la spécialisation partielle du modèle de classe

  template<typename T> struct PushImpl<const T&> { 
       typedef T* result_type; 
       typedef const T& argument_type; 
       template<int StackSize> static result_type Push(IStack<StackSize>* sptr, argument_type ref) { 
       // Code if the template is T& 
       } 
      }; 
      template<typename T> struct PushImpl<const T*> { 
       typedef T* result_type; 
       typedef const T* argument_type; 
       template<int StackSize> static result_type Push(IStack<StackSize>* sptr, argument_type ptr) { 
        return PushImpl<const T&>::Push(sptr, *ptr); 
       } 
      }; 
      template<typename T> struct PushImpl { 
       typedef T* result_type; 
       typedef const T& argument_type; 
       template<int StackSize> static result_type Push(IStack<StackSize>* sptr, argument_type ref) { 
       // Code if the template is neither T* nor T& 
       } 
      }; 

      template<typename T> typename PushImpl<T>::result_type Push(typename PushImpl<T>::argument_type ref) { 
       return PushImpl<T>::Push(this, ref); 
      } 

Première: Le struct est imbriqué dans une autre classe (celui qui offre poussée comme func membre), mais il ne peut pas accéder au paramètre de modèle (StackSize), même si mes autres classes imbriquées pouvaient tous. J'ai travaillé autour de ça, mais ce serait plus propre s'ils pouvaient simplement accéder à StackSize comme une classe normale. Deuxièmement: Le compilateur se plaint qu'il n'utilise pas ou ne peut pas déduire T. Vraiment? Troisièmement: Le compilateur se plaint qu'il ne peut pas spécialiser un modèle dans la portée actuelle (portée de classe).

Je ne vois pas quel est le problème. Ai-je accidentellement invoqué une mauvaise syntaxe?

Répondre

4

Le cas général doit apparaître avant les spécialisations, sinon les spécialisations n'ont rien à spécialiser.