Spécialisation partielle C ++ (pointeurs de fonction)

Quelqu’un peut-il dire s’il vous plaît, si ci-dessous est légal c ++ ou non?

template  class c {}; 

// spécialisation partielle

 template  class c < s*, s* & (*fn)(s**) {}; 

Erreur g ++ (4.2.4): un appel de fonction ne peut pas apparaître dans une erreur d’expression constante: l’argument de modèle 2 n’est pas valide.

Bien que cela fonctionne pour une spécialisation explicite

 int & func ( int * ) { return 0; } template  class c  class c {}; 

je pense que vous voulez dire

 template < typename s , s & (*fn) ( s * ) > class c {}; // partial specialization template < typename s , s & (*fn) ( s * ) > class c < s*, fn > {};