Vorlagenfunktion innerhalb der Vorlagenklasse

119

Ich habe diesen Code:

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

Ich möchte es in dieser Form:

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

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

Wie kann ich das machen? Was ist die richtige Syntax?

Michael
quelle
Warum nicht einfach die Funktion in der Klasse deklarieren (siehe codepad.org/wxaZOMYW )? Sie können die Funktion
dec
@hiobs: FWIW, Sie können die Deklaration in eine CPP-Datei verschieben. Das heißt, ich habe das nur einmal gemacht, um etwas Hackery zu machen. In diesem Fall ist es wichtig zu wissen, wie dies zu tun ist.
Thomas Eding
Manchmal muss die Funktionsdefinition nach der Definition der vom Funktionskörper benötigten Abhängigkeiten außerhalb der Klasse verschoben werden. Dies geschieht, wenn Klasse A Klasse B verwendet und B auch A verwendet. In diesem Fall deklarieren Sie A und B und definieren dann die Methoden A und B.
Wheezil

Antworten:

180

Schreib Dies:

template <class T>
template <class U>
void MyClass<T>::foo() { /* ... */ }
Kerrek SB
quelle
void MyClass <T> :: foo <T> () ... danke, ich habe es schon einmal versucht, aber es funktioniert bei mir nicht. Vielleicht musste ich ein sauberes Projekt machen.
Michael
@ user1074367: Nein, ich denke es ist wie ich sage.
Kerrek SB
3
Eigentlich habe ich geschrieben: template <Klasse T> template <Klasse U> void MyClass <T> :: foo () {U a; a.invoke (); } und es funktioniert
Michael
11
@ user1074367: Äh ... ja, das sage ich in der Antwort, nicht?
Kerrek SB
8
@mike: Mitgliedervorlagen sind eine ganz normale und übliche Sache.
Kerrek SB