Bagaimana cara secara eksplisit memberi contoh fungsi template?

117

Saya memiliki fungsi template dengan satu argumen. Saya harus instantiate fungsi itu tanpa memanggil fungsi itu berarti secara eksplisit saya harus instantiate.

Saya memiliki fungsi ini:

template <class T> int function_name(T a) {}

Saya memberi contoh fungsi itu seperti ini:

template int function_name<int>(int);

Tapi saya mendapat kesalahan berikut:

error: expected primary-expression before 'template'
error: expected `;' before 'template'
Balaji
sumber

Jawaban:

182

[EDIT 2]: Perhatikan bahwa ada beberapa kebingungan terkait kode dalam pertanyaan asli karena masalah format kode. Lihat jawaban AnthonyHatchkins untuk lebih jelasnya.

Jika Anda benar-benar ingin memberi contoh (bukan mengkhususkan atau sesuatu) fungsi, lakukan ini:

template <typename T> void func(T param) {} // definition

template void func<int>(int param); // explicit instantiation.

[EDIT] Tampaknya ada (banyak) kebingungan mengenai instansiasi eksplisit dan spesialisasi. Kode yang saya posting di atas berhubungan dengan instansiasi eksplisit . Sintaksis untuk spesialisasi berbeda. Berikut sintaks untuk spesialisasi:

template <typename T> void func(T param) {} // definition

template <> void func<int>(int param) {} // specialization

Perhatikan bahwa tanda kurung sudut setelah templat!

hrnt
sumber
3
itu instansiasi atau spesialisasi ?
Nawaz
5
Tidak benar. Anda dapat memberi tahu kompilator untuk membuat contoh template secara eksplisit. Google untuk "pembuatan template eksplisit C ++" untuk detail selengkapnya.
hrnt
8
@Nawaz: kamu salah. Tentu saja compiler-lah yang membuat instance, baris itu adalah permintaan dari programmer ke compiler untuk membuat instance template. Jika Anda memiliki salinan standar C ++, baca 14.7.2 Instansiasi eksplisit
David Rodríguez - dribeas
16
Spesialisasi berarti Anda mungkin mengubah implementasinya. Instansiasi berarti Anda menetapkannya ke unit kompilasi tertentu, mungkin untuk mengambil alamat uniknya atau membuatnya tersedia sebagai fungsi pustaka atau untuk mengurangi pembengkakan.
CashCow
3
@hrnt: Saya pikir, Anda benar. @Ashot: Saya baru saja memperhatikan bahwa sintaks tidak memiliki template<>bentuk. Apa yang dia tulis berbeda dengan spesialisasi . 1 untuk mengajari saya hal baru ini. Saya menghapus postingan saya. : D
Nawaz
20

Kode Anda benar.

Pesan kesalahan berkaitan dengan tempat di kode yang tidak Anda kutip di sini.

Memperbarui:

Kode asli adalah

template <class T> int function_name(T a) {}
template int function_name<int>(int);

dan itu benar.

Tetapi tidak dikutip dan dengan demikian terlihat seperti ini:

template int function_name(T a) {}
template int function_name(int);

Ini menghasilkan kesalahan berikut

a.cpp:1: error: explicit instantiation of non-template int function_name
a.cpp:1: error: expected `;' before ‘(’ token
a.cpp:3: error: function_name is not a template function

yang jelas berbeda dari apa yang dikutip OP.

Dalam varian ini, baris kedua tidak apa-apa ( <int>dapat dihilangkan di sini), tetapi baris pertama salah. Kompilator tidak dapat menebak bahwa itu Tadalah parameter template.

Antony Hatchkins
sumber
Secara teknis itu bukan kodenya, itu suntingan Bill :) Kode aslinya adalah template int function_name( T a) { }dantemplate int function_name(int);
hrnt
@hrnt Kode asli tidak diformat dengan benar, namun benar. Jika saya adalah Balaji, saya akan kembali dan menerima jawaban Anda jika dia menganggapnya berguna, namun bagi saya (dan mungkin bagi orang lain) jawaban Anda (meski dengan sendirinya benar) tidak menjawab pertanyaan itu.
Antony Hatchkins
@hrnt Anda benar bahwa kode aslinya terlihat seperti itu. Tetapi karena argumen template yang disimpulkan itu masih berfungsi. Saya harus setuju dengan Antony Hatchkins bahwa kesalahan muncul dari kode yang tidak dikutip oleh OP, namun menurut saya jawaban Anda masih berguna untuk orang-orang yang tidak tahu tentang instansiasi eksplisit.
mpark
Ambil saya sebagai contoh. Saya mencari halaman ini di Google ketika saya ingin menyegarkan kembali pengetahuan saya yang terlupakan tentang instansiasi eksplisit - dan itu tidak banyak membantu saya. Bagi saya, tidak ada kebingungan tentang sintaksnya. Apa yang dapat menyebabkan kebingungan tentang contoh eksplisit adalah penggunaannya
Antony Hatchkins
@AntonyHatchkins Ah, benar - Saya tidak melihat sumber pertanyaan asli, hanya bagaimana pertanyaan itu muncul di layar saya. Saya akan memberi ini +1 dan mengubah jawaban awal saya untuk mencatat kebingungan terkait pertanyaan awal.
jam