Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah saya boleh menyelesaikan ralat tidak padan jenis yang berlaku dalam fungsi `print_container`?

Bagaimanakah saya boleh menyelesaikan ralat tidak padan jenis yang berlaku dalam fungsi `print_container`?

DDD
Lepaskan: 2024-11-01 12:20:30
asal
635 orang telah melayarinya

How can I resolve type mismatch errors occurring in a `print_container` function?

Menyelesaikan Ralat Tidak Padan Jenis dalam Fungsi print_container

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&amp; operator()(const std::stack<T>&amp; s) const { return s.top(); }
};

template <typename T>
struct element_accessor<std::queue<T>> {
   const T&amp; operator()(const std::queue<T>&amp; q) const { return q.front(); }
};

template<typename Cont>
void print_container(Cont&amp; cont){
   while(!cont.empty()){
      auto elem = element_accessor<Cont>{}(cont);
      std::cout << elem << '\n';
      cont.pop();
   }
}
Salin selepas log masuk

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>&amp; 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>
Salin selepas log masuk

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan