Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat penyusunan C++: Parameter templat tidak boleh digunakan untuk jenis ini. Bagaimanakah saya harus mengubah suainya?

Ralat penyusunan C++: Parameter templat tidak boleh digunakan untuk jenis ini. Bagaimanakah saya harus mengubah suainya?

WBOY
WBOYasal
2023-08-22 14:15:44836semak imbas

Ralat penyusunan C++: Parameter templat tidak boleh digunakan untuk jenis ini. Bagaimanakah saya harus mengubah suainya?

C++ ialah bahasa pengaturcaraan yang digunakan secara meluas dengan banyak templat yang membolehkan pengaturcara membuat kod dengan cepat yang biasa kepada pelbagai jenis data dan algoritma. Walau bagaimanapun, anda juga akan menghadapi beberapa ralat kompilasi apabila menggunakan templat, salah satunya ialah "parameter templat tidak boleh digunakan untuk jenis ini". Artikel ini akan memperincikan latar belakang, punca dan penyelesaian kepada ralat ini.

Latar Belakang

Templat dalam C++ ialah corak pengaturcaraan umum yang boleh digunakan untuk menjana pelbagai jenis kod. Sebagai contoh, kita boleh menggunakan templat untuk mencipta fungsi umum yang boleh menerima jenis parameter yang berbeza dan secara dinamik memanggil kod yang berbeza berdasarkan jenisnya.

Parameter templat dalam C++ dibahagikan kepada parameter jenis dan parameter bukan jenis. Parameter jenis merujuk kepada jenis data yang akan digunakan dalam templat, manakala parameter bukan jenis merujuk kepada beberapa pemalar atau penunjuk fungsi, dsb. Parameter ini mesti ditentukan pada masa penyusunan.

Biasanya, parameter jenis yang digunakan dalam templat harus digunakan untuk pelbagai jenis data, tetapi kadangkala ralat penyusunan berlaku, menggesa "Parameter templat tidak boleh digunakan untuk jenis ini." Seterusnya, kami akan memperkenalkan punca dan penyelesaian ralat ini.

Punca

Parameter templat tidak boleh digunakan untuk ralat jenis ini biasanya disebabkan oleh sebab berikut:

  1. Ketakpadanan jenis parameter templat:

Apabila kami menentukan templat, jenis parameter templat harus sepadan dengan keperluan kami Jenis data yang dihantar masuk. Jika jenis data yang dihantar tidak sepadan dengan jenis parameter templat, ralat akan dilaporkan.

Sebagai contoh, dalam kod berikut, kami mentakrifkan fungsi templat dan menggunakan parameter templat T di dalam fungsi:

template <typename T>
void print(T value) {
    cout << value << endl;
}

Kemudian kami memanggil fungsi ini dan menghantar rentetan sebagai parameter, dan ralat akan dilaporkan:

print("hello");  // 模板参数不适用于这个类型

Ini kerana jenis parameter dalam fungsi templat mestilah sama dengan jenis parameter yang diluluskan. Apa yang dihantar di sini ialah pemalar rentetan, dan jenis parameter templat ialah T, jadi ralat berlaku.

  1. Jenis tidak ditakrifkan:

Apabila kami menggunakan jenis yang tidak ditentukan sebagai parameter templat, pengkompil tidak dapat mencari jenis ini dan akan melaporkan ralat.

Sebagai contoh, dalam kod berikut, kami mentakrifkan kelas templat, yang menggunakan parameter jenis tidak ditentukan:

template <typename T>
class Test {
public:
    void print(T value) {
        cout << value << endl;
    }
};

int main() {
    Test<UnknownType> a; // 模板参数不适用于这个类型
    return 0;
}

Dalam kod di atas, kami mentakrifkan jenis tidak ditentukan bernama UnknownType Apabila mentakrifkan kelas templat Apabila menghantarnya sebagai templat parameter, ralat akan berlaku semasa penyusunan.

  1. Parameter templat tidak memenuhi keperluan:

Kadangkala kami juga menambah beberapa sekatan pada parameter templat, seperti hanya membenarkan jenis data tertentu dihantar masuk. Apabila jenis data yang kami masukkan tidak memenuhi sekatan, ralat akan dilaporkan.

Sebagai contoh, dalam kod berikut, kami mentakrifkan fungsi templat yang hanya membenarkan parameter jenis integer dihantar dalam:

template <typename T>
void print(T value) {
    static_assert(is_integral<T>::value, "只允许传入整数类型的参数");
    cout << value << endl;
}

int main() {
    print(3.14); // 模板参数不适用于这个类型
    return 0;
}

Dalam kod di atas, kami menggunakan templat is_integral untuk menentukan sama ada jenis parameter templat ialah integer taip. Jika tidak, Mesej ralat dicetak. Apabila memanggil fungsi cetakan, kami memasukkan parameter titik terapung, yang akan menyebabkan penyusunan gagal.

Penyelesaian

Apabila ralat kompilasi berlaku bahawa parameter templat tidak sesuai untuk jenis ini, kita boleh mencuba penyelesaian berikut:

  1. Sahkan sama ada jenis parameter templat sepadan dengan jenis parameter masuk

Apabila ralat seperti ini berlaku Apabila ralat berlaku, anda harus terlebih dahulu menyemak sama ada jenis parameter templat dan jenis parameter masuk sepadan Jika ia tidak sepadan, ia perlu diubah suai.

  1. Sahkan sama ada jenis yang digunakan telah ditentukan

Jika jenis yang tidak ditentukan digunakan sebagai parameter templat, anda perlu menentukan jenis dalam atur cara atau menggunakan jenis yang ditentukan.

  1. Sahkan sama ada parameter templat memenuhi keperluan

Apabila menggunakan templat dengan sekatan, anda harus memastikan bahawa jenis parameter yang diluluskan memenuhi keperluan. Jika ia tidak mematuhi, anda perlu mengubah suai jenis parameter atau mengubah suai sekatan.

Ringkasan

Templat ialah ciri yang sangat penting dalam C++, yang membolehkan kami menulis kod umum dengan lebih fleksibel. Walau bagaimanapun, apabila menggunakan templat, anda juga akan menghadapi beberapa ralat kompilasi, salah satunya ialah "parameter templat tidak boleh digunakan untuk jenis ini". Artikel ini memperkenalkan punca dan penyelesaian kepada ralat ini dengan contoh kod, dengan harapan dapat membantu pembaca memahami dan menggunakan templat C++ dengan lebih baik.

Atas ialah kandungan terperinci Ralat penyusunan C++: Parameter templat tidak boleh digunakan untuk jenis ini. Bagaimanakah saya harus mengubah suainya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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