2011-02-02 8 views

Respuesta

12

Es una especialización. template<> significa que la especialización en sí misma no está templada, es decir, es una especialización explícita, no una especialización parcial.

+0

"plantilla <> significa que la especialización en sí no se templated". Esto no es completamente correcto, ya que se aplica solo para ese ejemplo en particular. Por ejemplo: 'plantilla estructura A {plantilla void f(); }; plantilla <> plantilla void A :: f() {} '. En este otro ejemplo, la especialización explícita del miembro sigue siendo una plantilla. (Es un poco quisquilloso, pero es importante saberlo). –

+0

No entiendo la respuesta. ¿Podrías enmendar para mostrar cómo se diferencia entre parcial y especial? – wallyk

4

Puede decir que solo es la sintaxis requerida.

La sintaxis normal sería template< typename T > struct Allowed;

Porque sabemos que en este caso T es std :: string no hay nada para poner dentro de los paréntesis angulares, pero la plantilla de la palabra y los paréntesis angulares todavía son necesarios porque escribir struct Allowed<std::string> por sí sola no implicaría que son especializando la plantilla pero simplemente creando una instancia con std :: string como tipo. (La palabra "struct" no es necesaria para hacer eso, pero todavía está permitida).

10

Es una especialización de plantilla. El caso típico sería la especialización parcial:

#include <iostream> 

template<class T1, class T2> struct foo 
{ 
    void doStuff() { std::cout << "generic foo "; } 
}; 

template<class T1> 
struct foo<T1, int> 
{ 
void doStuff() { std::cout << "specific foo with T2=int"; } 
}; 

Como se puede ver, la especialización elimina un elemento a partir de los parámetros de plantilla y explícitamente establece un tipo en lugar de la retirada. Esto significa que si sólo hay un tipo de plantilla, la <> sólo se convertirá en vacío:

template<class T1> struct bar 
{ 
    void doStuff() { std::cout << "generic bar"; } 
}; 

template<> 
struct bar<int> 
{ 
void doStuff() { std::cout << "specific bar with T1=int"; } 
};