2012-03-24 10 views
5

¿Cómo especializo una plantilla anidada? (Consulte el error a continuación.)La especialización de plantilla anidada resulta en "Uso ilegal de argumentos de plantilla explícitos"?

using std::reverse_iterator; 

template<typename It> 
reverse_iterator<It> make_reverse_iterator(const It &it) 
{ 
    return reverse_iterator<It>(it); 
} 

template<typename It> 
It make_reverse_iterator<reverse_iterator<It> >(const reverse_iterator<It> &it) 
{ 
    // Above     ^
    // error C2768: 
    // 'make_reverse_iterator': illegal use of explicit template arguments 
    return it.base(); 
} 
+0

¿Dónde está la plantilla anidada en el ejemplo? Todo lo que veo es una especialización de función parcial, que no está permitida. –

+0

@ R.MartinhoFernandes: Tal vez utilicé el término equivocado ... Me refiero a especializar para el 'reverse_iterator 'templado ', basado en el tipo ('anidado)' It'. – Mehrdad

+0

La especialización parcial de plantillas de funciones no está permitida, ¿no es esto lo que sucede aquí? – Jon

Respuesta

6

Esta es una especialización parcial de una plantilla de función. Esto no esta permitido.

Usted puede resolver el problema en este ejemplo con una sobrecarga en su lugar:

template<typename It> 
It make_reverse_iterator(const reverse_iterator<It> &it) 
{ 
    return it.base(); 
} 

En los casos en que las sobrecargas no funcionan se puede recurrir a la especialización parcial de plantillas de clase.

+0

+1, pero ¿por qué se llama "parcial"? – Mehrdad

+0

Tenía la impresión de que la solución habitual está sobrecargando la función ...? – Jon

+0

@Jon: Oh, no noté que la sobrecarga realmente funcionó en este caso (no siempre es posible hacerlo con sobrecargas) Gracias, editaré. –

4

Esto es partial function template specialization, lo cual no está permitido. Sin embargo, puede lograr el mismo efecto por la sobrecarga de la función:

template<typename It> 
It make_reverse_iterator(const reverse_iterator<It> &it) 
{ 
    return it.base(); 
} 

Lo anterior no es una especialización de plantilla, pero una sobrecarga de la plantilla de make_reverse_iterator donde el parámetro es un const_reverse_iterator<It>.

+0

Algo me dice que [Dimov/Abrahams] (http://www.gotw.ca/publications/mill17.htm) podría aplicarse aquí, por lo que solo * una * de las soluciones aquí es correcta, pero no ambas (sobrecarga o especialización) , No sé cuál). ¿Alguna idea? – Mehrdad

Cuestiones relacionadas