Funkcja szablonu w klasie szablonu

119

Mam ten kod:

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

Chcę to w tej formie:

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

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

Jak mogę to zrobić? Jaka jest prawidłowa składnia?

Michael
źródło
Dlaczego po prostu nie zdeklarować funkcji wewnątrz deklaracji klasy (patrz codepad.org/wxaZOMYW )? I tak nie możesz przenieść funkcji decl z nagłówka, więc ...
hiobs,
@hiobs: FWIW, możesz przenieść deklarację do pliku CPP. To powiedziawszy, zrobiłem to tylko raz, aby zrobić hakera. W takim przypadku niezbędna jest wiedza, jak to zrobić.
Thomas Eding
Czasami trzeba przenieść definicję funkcji poza klasę, po zdefiniowaniu zależności wymaganych przez ciało funkcji. Dzieje się tak, gdy klasa A używa klasy B, a B również używa A. W takim przypadku deklarujesz A i B, a następnie definiujesz metody A i B.
Wheezil

Odpowiedzi:

180

Napisz to:

template <class T>
template <class U>
void MyClass<T>::foo() { /* ... */ }
Kerrek SB
źródło
void MyClass <T> :: foo <T> () ... dzięki, próbowałem tego wcześniej, ale to nie działa ... może musiałem zrobić czysty projekt.
Michael,
@ user1074367: Nie, myślę, że jest tak, jak mówię.
Kerrek SB
3
właściwie napisałem: template <class T> template <class U> void MyClass <T> :: foo () {U a; a.invoke (); } i działa
Michael
11
@ user1074367: Err ... tak, to właśnie mówię w odpowiedzi, nie?
Kerrek SB
8
@mike: Szablony członków są całkowicie normalną i powszechną rzeczą.
Kerrek SB