2009-05-19 13 views
1

Quelqu'un peut-il dire s'il est légal ou non?Spécialisation partielle C++ (Pointeurs de fonction)

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

// spécialisation partielle

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

g++ (4.2.4) error: a function call cannot appear in a constant-expression error: template argument 2 is invalid

Bien qu'il travaille pour la spécialisation explicite

int & func (int *) { return 0; } 
template <> class c < int , func> class c {}; 
+0

Il manque un ">" BTW à votre deuxième extrait de code. –

Répondre

8

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 > {}; 
+0

En fait, je veux spécialiser le deuxième argument sur la base du premier type? Est-ce que ça fait du sens ? –

+1

@Shaikh: C'est exactement ce que fait la réponse de James. Qu'est-ce qui vous déroute? –

+0

thumbs up! :) –