2011-12-29 23 views
5

que estoy tratando de hacer la especialización de operador de plantilla, la plantilla se ve así:operador() plantilla de especialización

template <typename Iterator1, typename Iterator2> 
ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType worst_dist = -1) const 

después de que hice la especialización que tiene este aspecto:

template <> 
float operator()<float*,float*>(float* a, float const* b, unsigned long size, float worst_dist = -1) const 

i obtener un error durante la compilación:

no se puede especializar un 'operador()' función dentro de ámbito de clase

Todos aquellos función están en plantilla de estructura

estaré contento de conseguir un poco de ayuda. gracias.

+0

Cuando dice "especificación", ¿quiere decir "especialización"? –

+0

Creo que [esta pregunta/respuesta SO] [1] podría estar respondiendo a lo que está tratando de hacer. [1]: ¿Cuál es http://stackoverflow.com/questions/4920068/partially-specializing-member-function-implementations – wilx

+0

'ResultType'? ¿Se supone que es uno de los parámetros de tu plantilla? –

Respuesta

7

¿Por qué quiere especializar este operador de todos modos? No podrá llamarlo utilizando la sintaxis que depende de las especializaciones (es decir, explícitamente proporcionando los [algunos de] los argumentos de la plantilla) de todos modos. Simplemente usa sobrecarga y deberías estar bien. Aunque a veces es deseable o incluso necesario utilizar la notación donde especifica explícitamente los argumentos de la plantilla, tiende a ser poco importante para las funciones en general utilizar la especialización en lugar de la sobrecarga.

Acabo de leer cosas en el estándar y en realidad es posible proporcionar una especialización explícita, sin embargo, tiene que estar fuera de la definición de la clase. Por ejemplo:

#include <iostream> 

struct foo 
{ 
    template <typename T> void operator()(T const&) { 
     std::cout << "general\n"; 
    } 
}; 

template <> 
void foo::operator()<int>(int const&) { 
    std::cout << "int spec\n"; 
} 

int main() 
{ 
    foo f; 
    f(1.2); 
    f(1); 
    f<double>(1); // <-- ERROR: doesn't work! 
} 

Esto habría funcionado de la misma manera al sobrecargar. Sin embargo, el uso de argumentos de plantilla explícitamente especificados todavía no funciona.

+1

+1 para la sobrecarga de funciones por especialización. – AJG85

+0

veo, gracias por la respuesta –

Cuestiones relacionadas