Funzione template all'interno della classe template


119

Ho questo codice:

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

Lo voglio in questa forma:

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

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

Come posso farlo? Qual è la sintassi giusta?


Perché non semplicemente la funzione decl nella classe decl (vedi codepad.org/wxaZOMYW )? Non puoi comunque spostare la funzione decl fuori dall'intestazione, quindi ...
hiobs

@ hiobs: FWIW, puoi spostare la dichiarazione in un file CPP. Detto questo, l'ho fatto solo una volta per fare un po 'di hackery. In tal caso, sapere come farlo è essenziale.
Thomas Eding

A volte è necessario spostare la definizione della funzione al di fuori della classe, dopo la definizione delle dipendenze necessarie al corpo della funzione. Ciò accade quando la classe A usa la classe B e anche B usa A. In quel caso si dichiara A e B, quindi si definiscono i metodi A e B.
Wheezil

Risposte:


180

Scrivi questo:

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

void MyClass <T> :: foo <T> () ... grazie, l'ho provato prima, ma non funziona per me .. forse dovevo fare un progetto pulito.
Michael

@ user1074367: No, penso che sia come ho detto.
Kerrek SB

3
in realtà ho scritto: template <class T> template <class U> void MyClass <T> :: foo () {U a; a.invoke (); } e funziona
Michael

11
@ user1074367: Err ... sì, è quello che dico nella risposta, no?
Kerrek SB

8
@mike: i modelli di membri sono una cosa perfettamente normale e comune.
Kerrek SB
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.