2009-06-09 24 views
119

Sé que es posible hacer una función de plantilla:¿Cómo crear una función de plantilla dentro de una clase? (C++)

template<typename T> 
void DoSomeThing(T x){} 

y es posible hacer una clase de plantilla:

template<typename T> 
class Object 
{ 
public: 
    int x; 
}; 

pero ¿es posible hacer que una clase no dentro de una plantilla , y luego hacer una función en esa clase una plantilla? Es decir:

//I have no idea if this is right, this is just how I think it would look 
class Object 
{ 
public: 
    template<class T> 
    void DoX(){} 
}; 

o algo en la medida en que la clase no es parte de una plantilla, pero la función es?

Respuesta

88

Su conjetura es la correcta. Lo único que debe recordar es que la plantilla de función miembro definición (además de la declaración) debe estar en el archivo de encabezado, no en el cpp, aunque sí no debe estar en el cuerpo de la declaración de clase sí mismo.

+3

Y también que no puede especializarlos. :-( –

+7

No es exactamente cierto. La definición puede estar en un archivo cpp, siempre que se llame una vez para cada parámetro de plantilla único n-uplet desde una función/método que no sea de plantilla después de haberla definido. –

+1

Por lo tanto, mi " debería "- mantenerlo en el encabezado es la forma más sencilla de lograrlo. –

58

Ver aquí: Templates, template methods, plantillas miembros, plantillas de función miembro

class Vector 
{ 
    int  array[3]; 

    template <class TVECTOR2> 
    void eqAdd(TVECTOR2 v2); 
}; 

template <class TVECTOR2> 
void Vector::eqAdd(TVECTOR2 a2) 
{ 
    for (int i(0); i < 3; ++i) array[i] += a2[i]; 
} 
15

Sí, las funciones de miembros de la plantilla son perfectamente legales y útiles en numerosas ocasiones.

La única advertencia es que las funciones de los miembros de la plantilla no pueden ser virtuales.

Cuestiones relacionadas