2010-05-30 6 views
9

Je suis classe avec des méthodes de modèle qui ressemble à ceci:boost :: méthode de modèle de classe enable_if

struct undefined {}; 

template<typename T> struct is_undefined : mpl::false_ {}; 

template<> struct is_undefined<undefined> : mpl::true_ {}; 

template<class C> 
struct foo { 
     template<class F, class V> 
     typename boost::disable_if<is_undefined<C> >::type 
      apply(const F &f, const V &variables) { 
     } 

     template<class F, class V> 
     typename boost::enable_if<is_undefined<C> >::type 
      apply(const F &f, const V &variables) { 
     } 
}; 

apparemment, les deux modèles sont instanciés, ce qui entraîne une erreur de compilation. est l'instanciation de méthodes de modèle différentes de l'instanciation de fonctions libres? J'ai réparé cela différemment, mais j'aimerais savoir ce qui se passe. la seule chose que je peux penser que pourrait provoquer ce problème, ce qui permet l'état ne dépend pas des arguments de modèle immédiats, mais les arguments de modèle plutôt classe

Merci

Répondre

12

Votre C ne participe pas à la déduction pour apply. Voir this answer pour une explication plus détaillée de la raison pour laquelle votre code échoue.

Vous pouvez résoudre comme ceci:

template<class C> 
struct foo {  
     template<class F, class V> 
     void apply(const F &f, const V &variables) { 
      apply<F, V, C>(f, variables); 
     } 

private: 
     template<class F, class V, class C1> 
     typename boost::disable_if<is_undefined<C1> >::type 
      apply(const F &f, const V &variables) { 
     } 

     template<class F, class V, class C1> 
     typename boost::enable_if<is_undefined<C1> >::type 
      apply(const F &f, const V &variables) { 
     } 
}; 
+0

vous remercie une fois de plus. – Anycorn

Questions connexes