2010-05-30 11 views
9

llegué clase con métodos de plantilla que mira esto:impulso :: método de plantilla de clase 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) { 
     } 
}; 

parecer, ambas plantillas se crea una instancia, lo que resulta en un error de tiempo de compilación. ¿ejemplifica los métodos de plantilla diferentes de la instanciación de funciones libres? He solucionado esto de manera diferente, pero me gustaría saber qué ocurre. lo único que se me ocurre que podría causar este comportamiento, lo que permite condiciones no depende argumentos de plantilla inmediatos, pero los argumentos de plantilla en lugar de clase

Gracias

Respuesta

12

Su C no participa en la deducción por apply. Consulte this answer para obtener una explicación más detallada de por qué falla su código.

Puede resolver de esta manera:

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

gracias una vez más. – Anycorn

Cuestiones relacionadas