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?


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.