Kelas Templat dengan Fungsi Ahli Terkhusus Secara Eksplisit
Apabila mentakrifkan pengkhususan eksplisit untuk fungsi ahli templat kelas, perangkap biasa berlaku apabila templat kelas sekeliling juga merupakan templat. Untuk memahami isu ini, pertimbangkan contoh berikut:
#include <iostream> #include <cmath> template <class C> class X { public: template <class T> void get_as(); }; template <class C> void X<C>::get_as<double>() {} // Explicit specialization for double int main() { X<int> x; x.get_as(); }
Kod ini cuba mengkhususkan fungsi ahli get_as secara eksplisit untuk double untuk templat kelas X. Walau bagaimanapun, pendekatan ini membawa kepada ralat pengkompil kerana templat kelas sekeliling tidak dikhususkan secara eksplisit.
Pendekatan Salah:
Percubaan untuk mengkhususkan fungsi ahli secara eksplisit tanpa mengkhususkan kelas templat, seperti yang ditunjukkan di bawah, ialah salah:
template <class C> template<> void X<C>::get_as<double>() {}
Penyelesaian Betul:
Untuk membetulkan isu ini, kedua-dua templat kelas dan fungsi ahli mestilah khusus secara eksplisit. Contohnya, untuk mengkhususkan fungsi get_as hanya untuk X
template <> template <class T> void X<int>::get_as() {} template <> void X<int>::get_as<double>() {}
Pilihan Alternatif:
Sebagai alternatif, untuk mengekalkan persekitaran templat kelas tidak dikhususkan, lebihan fungsi get_as boleh digunakan, seperti yang ditunjukkan dalam yang berikut kod:
template <class C> class X { template<typename T> struct type { }; public: template <class T> void get_as() { get_as(type<T>()); } private: template<typename T> void get_as(type<T>) {} void get_as(type<double>) {} };
Atas ialah kandungan terperinci Bagaimana Mengkhususkan Fungsi Ahli Templat Kelas dengan Jelas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!