2009-09-12 15 views
20

El siguiente código de plantilla de especialización:C++ especialización de plantilla de función: "uso ilegal de argumentos de plantilla explícitas"

template<typename T1, typename T2> 
void spec1() 
{ 

} 

caso de prueba 1:

template< typename T1> //compile error 
void spec1<int>() 
{ 

} 

caso de prueba 2:

template< typename T2> //compile error 
void spec1<int>() 
{ 

} 

genera el siguiente error de compilación:

error C2768: 'spec1' : illegal use of explicit template arguments

¿Alguien sabe por qué? plantillas

+0

¿Qué plataforma/compilador estás usando? – aaa90210

+0

Estoy usando Visual C++ 08 – jameszhao00

Respuesta

51

función no puede ser parcialmente especializados, solamente totalmente, es decir, de esa manera:

template<> 
void spec1<char, int>() 
{ 

} 

Por qué plantillas de funciones no pueden ser parcialmente especializada, es posible que desee read this.

Cuando usted se especializa parcialmente (sólo es posible para las clases), usted tendría que hacerlo así:

template <typename T1> 
class class1<T1, int> 
{ 

}; 

por lo que tienen a la lista T1 nuevo.

La forma en que se escriben sus especializaciones, sería ambiguo para spec1<int, int>.

+3

Ah, ¿así que puedo tener clases parcialmente especializadas integradas con funciones estáticas? – jameszhao00

+0

Oh, veo que el artículo que enlazas explica las cosas ya. Eliminé mi respuesta, ya que encontré que reenviar a una clase es más conveniente para este caso. Sin embargo, en los casos en que 'T1' y' T2' se usan como tipos de los parámetros de la función, encuentro que la sobrecarga es mucho más legible, ya que es como la sobrecarga de la función normal. –

+0

Cuando leí "solo es posible para las clases", me resistí. Descubrí que es posible para ambas clases y estructuras ;-). –

Cuestiones relacionadas