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.