Apabila menulis kod C++, kadangkala anda akan menghadapi ralat kompilasi seperti "jenis tempatan tidak dibenarkan sebagai parameter templat". Ini biasanya bermakna bahawa kami menggunakan jenis tempatan dalam parameter templat, seperti kelas atau jenis struct yang ditakrifkan di dalam fungsi. Dalam artikel ini, kita akan membincangkan masalah ini dan cara menyelesaikannya.
Mula-mula, mari kita lihat mengapa ralat kompilasi ini berlaku. Dalam C++, parameter templat mesti diselesaikan pada masa penyusunan, manakala definisi jenis tempatan berlaku pada masa jalan. Oleh itu, jenis tempatan tidak boleh digunakan sebagai parameter templat kerana pengkompil tidak tahu cara menghuraikannya.
Berikan contoh untuk menggambarkan masalah ini:
#include <iostream> template <typename T> void printSize(const T& arg){ struct localStruct { int i; }myLocalStruct; //定义了一个局部结构体类型 std::cout << "Size of arg = "<<sizeof(arg)<<" "; std::cout << "Size of localStruct = "<<sizeof(myLocalStruct)<<" "; } int main() { int x = 5; printSize(x); return 0; }
Dalam kod di atas, kami mentakrifkan fungsi templat printSize, yang menerima parameter arg. Kami juga mentakrifkan jenis struktur tempatan myLocalStruct dan menggunakan sizeof untuk mendapatkan saiznya dan parameter arg.
Apabila kami menyusun kod ini, kami mendapat mesej ralat: "Jenis tempatan tidak dibenarkan sebagai parameter templat".
Untuk menyelesaikan masalah ini, kita perlu menukar jenis tempatan kepada jenis global. Kita boleh mengalihkan definisi jenis tempatan di luar fungsi, atau mentakrifkannya sebagai jenis ahli kelas.
Mari lihat bagaimana kita boleh membetulkan kod di atas menggunakan jenis global:
#include <iostream> struct localStruct { int i; }; //将局部结构体类型定义为全局 template <typename T> void printSize(const T& arg){ localStruct myLocalStruct; std::cout << "Size of arg = "<<sizeof(arg)<<" "; std::cout << "Size of localStruct = "<<sizeof(myLocalStruct)<<" "; } int main() { int x = 5; printSize(x); return 0; }
Sekarang kita telah mengalihkan definisi struct setempat di luar fungsi. Pembaikan menyusun dan berjalan dengan jayanya, dan output adalah betul.
Selain menukar jenis tempatan kepada jenis global, penyelesaian lain ialah menentukan jenis tempatan sebagai jenis ahli kelas. Pendekatan ini memerlukan beberapa kod tambahan, tetapi kadangkala lebih mudah:
#include <iostream> template <typename T> class myClass{ public: struct localStruct { int i; }; void printSize(const T& arg){ localStruct myLocalStruct; std::cout << "Size of arg = "<<sizeof(arg)<<" "; std::cout << "Size of localStruct = "<<sizeof(myLocalStruct)<<" "; } }; int main() { int x = 5; myClass<int> obj; obj.printSize(x); return 0; }
Dalam kod di atas, kami mentakrifkan jenis struct setempat sebagai jenis ahli myClass. Pembetulan ini juga menyusun dan berjalan dengan jayanya dan mengeluarkan hasil yang betul.
Untuk meringkaskan, apabila kami menghadapi ralat kompilasi "jenis tempatan tidak dibenarkan sebagai parameter templat" apabila menggunakan templat C++, kami perlu menukar jenis tempatan kepada jenis global atau jenis ahli kelas. Pembetulan ini berjaya menyelesaikan isu ini.
Atas ialah kandungan terperinci Ralat kompilasi C++: jenis tempatan tidak dibenarkan sebagai parameter templat, bagaimana untuk menanganinya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!