Fungsi template di dalam kelas template

119

Saya memiliki kode ini:

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

Saya menginginkannya dalam bentuk ini:

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

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

Bagaimana saya bisa melakukan ini? Apa sintaks yang benar?

Michael
sumber
Mengapa tidak melakukan fungsi mendeklarasikan di dalam kelas mendeklarasikan (lihat codepad.org/wxaZOMYW )? Anda tidak dapat memindahkan fungsi deklarasi keluar dari header, jadi ...
hiobs
@hiobs: FWIW, Anda dapat memindahkan deklarasi ke dalam file CPP. Meskipun demikian, saya hanya melakukan ini sekali untuk melakukan peretasan. Dalam hal ini, mengetahui cara melakukan ini sangatlah penting.
Thomas Eding
Terkadang seseorang harus memindahkan definisi fungsi ke luar kelas, setelah definisi dependensi yang dibutuhkan oleh badan fungsi. Ini terjadi ketika kelas A menggunakan kelas B dan B juga menggunakan A. Dalam hal itu Anda mendeklarasikan A dan B, lalu tentukan metode A dan B.
Wheezil

Jawaban:

180

Tulis ini:

template <class T>
template <class U>
void MyClass<T>::foo() { /* ... */ }
Kerrek SB
sumber
void MyClass <T> :: foo <T> () ... terima kasih, saya sudah mencobanya sebelumnya, tetapi tidak berhasil untuk saya .. mungkin saya harus melakukan proyek bersih.
Michael
@ user1074367: Tidak, saya rasa seperti yang saya katakan.
Kerrek SB
3
sebenarnya saya menulis: template <class T> template <class U> void MyClass <T> :: foo () {U a; a.invoke (); } dan berhasil
Michael
11
@ user1074367: Err ... ya, itulah yang saya katakan di jawaban, bukan?
Kerrek SB
8
@mike: Template anggota adalah hal yang sangat normal dan umum.
Kerrek SB