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?


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() { /* ... */ }

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.