Función de plantilla dentro de la clase de plantilla

119

Tengo este codigo:

template <class T>
class MyClass {
    public:
        template <class U>
        void foo() {
            U a;
            a.invoke();
        }
};

Lo quiero en esta forma:

template <class T>
class MyClass {
    public:
        template <class U>
        void foo();
};

template <class T> /* ????? */
void MyClass<T>::foo() {
    U a;
    a.invoke();
}

¿Cómo puedo hacer esto? ¿Cuál es la sintaxis correcta?

Miguel
fuente
¿Por qué no simplemente decl la función dentro de la clase decl (ver codepad.org/wxaZOMYW )? No puedes mover la función decl fuera del encabezado de todos modos, así que ...
hiobs
@hiobs: FWIW, puede mover la declaración a un archivo CPP. Dicho esto, solo he hecho esto una vez para hacer algo de piratería. En ese caso, saber cómo hacer esto es fundamental.
Thomas Eding
A veces, se debe mover la definición de la función fuera de la clase, después de la definición de las dependencias que necesita el cuerpo de la función. Esto sucede cuando la clase A usa la clase B y B también usa A. En ese caso, declara A y B, luego define los métodos A y B.
Wheezil

Respuestas:

180

Escribe esto:

template <class T>
template <class U>
void MyClass<T>::foo() { /* ... */ }
Kerrek SB
fuente
void MyClass <T> :: foo <T> () ... gracias, lo intenté antes, pero no me funciona ... quizás tuve que hacer un proyecto limpio.
Michael
@ user1074367: No, creo que es como digo.
Kerrek SB
3
de hecho escribí: plantilla <clase T> plantilla <clase U> void MyClass <T> :: foo () {U a; a.invoke (); } y funciona
Michael
11
@ user1074367: Err ... sí, eso es lo que digo en la respuesta, ¿no?
Kerrek SB
8
@mike: Las plantillas de miembros son algo perfectamente normal y común.
Kerrek SB