Untuk memahami sebab fungsi print_container gagal, kita perlu menganalisis sifat templat std::is_same. Fungsi ini membandingkan dua jenis dan mengembalikan benar jika ia sama. Dalam kes ini, kami menggunakan std::is_same untuk menentukan sama ada jenis kontena Cont adalah sama dengan tindanan atau baris gilir. Walau bagaimanapun, cawangan pernyataan if-else bergantung pada jenis bekas yang tepat, yang membawa kepada ralat kompilasi kerana kedua-dua cawangan mesti boleh disusun.
Penyelesaian 1: Pengkhususan Separa
Satu penyelesaian ialah menggunakan pengkhususan separa untuk mencipta pelaksanaan berasingan elemen_accessor untuk jenis tindanan dan baris gilir. Ini membolehkan kami mengendalikan pengekstrakan unsur berdasarkan jenis bekas tertentu. Berikut ialah contoh pelaksanaan:
<code class="cpp">template <typename Cont> struct element_accessor; template <typename T> struct element_accessor<std::stack<T>> { const T& operator()(const std::stack<T>& s) const { return s.top(); } }; template <typename T> struct element_accessor<std::queue<T>> { const T& operator()(const std::queue<T>& q) const { return q.front(); } }; template<typename Cont> void print_container(Cont& cont){ while(!cont.empty()){ auto elem = element_accessor<Cont>{}(cont); std::cout << elem << '\n'; cont.pop(); } }
Dalam penyelesaian ini, element_accessor menyediakan cara yang konsisten untuk mengakses elemen teratas untuk kedua-dua tindanan dan elemen hadapan untuk baris gilir, menyelesaikan isu jenis ketidakpadanan.
Penyelesaian 2: jika constexpr (C 17)
Jika anda menggunakan C 17 atau lebih baru, anda boleh memanfaatkan sintaks if constexpr untuk melaksanakan percabangan berdasarkan parameter jenis templat. Berikut ialah versi diubah suai fungsi print_container:
<code class="cpp">template<template<class> typename Cont, typename T> void print_container(Cont<T>& cont){ while(!cont.empty()){ if constexpr (std::is_same_v<Cont<T>, std::stack<T>>) std::cout << cont.top() << '\n'; else if constexpr (std::is_same_v<Cont<T>, std::queue<T>>) std::cout << cont.front() << '\n'; cont.pop(); } }</code>
Dalam versi ini, cabang if constexpr dinilai pada masa penyusunan berdasarkan parameter jenis templat. Ini menghapuskan keperluan untuk pengkhususan separa dan memastikan keselamatan jenis.
Atas ialah kandungan terperinci Bagaimanakah saya boleh menyelesaikan ralat tidak padan jenis yang berlaku dalam fungsi `print_container`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!