Rumah > pembangunan bahagian belakang > C++ > Bagaimana Mengkhususkan Fungsi Ahli Templat Kelas dengan Jelas?

Bagaimana Mengkhususkan Fungsi Ahli Templat Kelas dengan Jelas?

Patricia Arquette
Lepaskan: 2024-12-27 22:47:10
asal
591 orang telah melayarinya

How to Correctly Explicitly Specialize a Member Function of a Class Template?

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();
}
Salin selepas log masuk

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>() {}
Salin selepas log masuk

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, gunakan pendekatan berikut:

template <>
template <class T>
void X<int>::get_as() {}

template <>
void X<int>::get_as<double>() {}
Salin selepas log masuk

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>) {}
};
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan