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?


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.