2011-06-09 14 views
5

estoy teniendo compilar los apuros de tiempo con el siguiente código:C++ pregunta plantilla de especialización parcial

template <typename T, 
      template <class T, class Allocator = std::allocator<T> > class C> 
    bool is_in(const C<T>& a, const C<T>& b); 

    template <typename T, std::vector> // HERE 
    bool is_in(const std::vector<T>& a, const std::vector<T>& b) 
    { 
    return false; // implementation tbd 
    } 

... 

vector<int> a, b; 

cout << is_in(a,b) << endl; 

El mensaje de error es (en la línea marcada "AQUÍ"):

error: 'std::vector' is not a type 

(de Por supuesto, I tiene vector incluido de std!). ¿Cualquier sugerencia? Estuve jugando con eso por un tiempo, pero estoy llegando al punto en el que podría necesitar algo de ayuda :-) Necesito especializar parcialmente la declaración de la plantilla inicial para que pueda tener las implementaciones de cambio de compilador dependiendo del tipo real del contenedor C (habrá un is_in para conjuntos, uno para vectores, uno para rangos ..., con diferentes algoritmos cada vez).

Gracias!

Respuesta

6

La especialización parcial de una plantilla de función no está permitida por el estándar.

Una solución simple es: usar sobrecarga.

template <typename T> 
bool is_in(const std::vector<T>& a, const std::vector<T>& b) 
{ 
    return false; // implementation tbd 
} 

Plantilla de función sobrecargada. Su NO es parcial especialización.

O bien, puede hacer esto:

namespace detail 
{ 
    template<typename T, typename C> 
    struct S 
    { 
     static bool impl(const C & a, const C & b) 
     { 
      //primary template 
      //... 
     } 
    } 
    template<typename T> 
    struct S<T, std::vector<T> > 
    { 
     static bool impl(const std::vector<T> & a, const std::vector<T> & b) 
     { 
      //partial specialization for std::vector 
      return false; 
     } 
    } 
} 

template <typename T, template <class T, class Allocator = std::allocator<T> > class C> 
bool is_in(const C<T>& a, const C<T>& b) 
{ 
    return detail::S<T, C<T> >::impl(a,b); 
} 
+1

Una solución es colocar la función en una clase. –

+0

Booouuuhhh! :-) Por supuesto, eso reducirá mis esfuerzos. Tendré que desplegar un objeto de función ... – Frank

0

No sé si funciona (como modelo modelos son siempre un problema a la mente), pero ¿qué pasa tratando

template <typename T> 
bool is_in(const std::vector<T>& a, const std::vector<T>& b) 
{ 
    ... 
} 

ya que es una especialización.

EDIT: Otros ya han aclarado esto, pero lo agregaré para completarlo. El código anterior es en realidad una sobrecarga y no una especialización parcial, pero las especializaciones de funciones parciales no están permitidas de todos modos.

+1

NO es una especialización. Su plantilla de función sobrecargada. – Nawaz

+0

@Nawaz Oh, sí, tienes razón. La respuesta de Luc aclara las diferencias de sintaxis, pero las especializaciones parciales no están permitidas de todos modos, como dices también en tu respuesta. –

1

La especialización parcial de la plantilla de función es no permitido. En cualquier caso, no está utilizando la sintaxis de especialización de plantilla, en realidad está escribiendo una sobrecarga adicional. Tal vez puedas probar:

template <typename T> 
bool is_in(const std::vector<T>& a, const std::vector<T>& b) 
{ 
    return false; // implementation tbd 
} 

Si la especialización parcial fueron permitidos, se vería como esto en su lugar:

template <typename T> // std::vector is not a template parameter, 
         // so we wouldn't put it here 
bool is_in<T, std::vector>(const std::vector<T>& a, const std::vector<T>& b) 
// instead, it'd appear^here, when we're specializing the base template 
{ 
    return false; // implementation tbd 
} 
+1

Esto da como resultado: error: la especialización parcial de la plantilla de función 'is_in clase std :: vector>' no está permitida de manera explícita. – Frank

+0

@Frank No copie y pegue el código. Sin embargo, he agregado énfasis en la publicación. –

+0

No copié y pegué. Lo había intentado antes. – Frank

Cuestiones relacionadas