Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat kompilasi C++: Derivasi templat gagal daripada berbilang ahli, bagaimana untuk menyelesaikannya?

Ralat kompilasi C++: Derivasi templat gagal daripada berbilang ahli, bagaimana untuk menyelesaikannya?

WBOY
WBOYasal
2023-08-22 15:15:14570semak imbas

Ralat kompilasi C++: Derivasi templat gagal daripada berbilang ahli, bagaimana untuk menyelesaikannya?

Apabila menggunakan templat dalam C++, kadangkala kami menghadapi ralat kompilasi Mesej ralat ialah "Penerbitan templat gagal daripada berbilang ahli." Jadi bagaimana kita harus menyelesaikan masalah ini?

Pertama, kita perlu memahami beberapa asas templat. Templat ialah konsep penting dalam C++ Kod biasa boleh ditulis sebagai templat, yang boleh menjadikan kod lebih fleksibel dan boleh digunakan untuk jenis data yang berbeza. Sintaks templat dalam C++ adalah sangat fleksibel Kami boleh menentukan templat fungsi, templat kelas, templat fungsi ahli, dsb.

Apabila kami menggunakan templat, pengkompil akan melakukan potongan jenis berdasarkan jenis parameter panggilan untuk mendapatkan contoh templat tertentu. Tetapi kadangkala pengkompil tidak dapat menyimpulkan jenis tertentu, dan ralat "Gagal diperoleh daripada berbilang ahli" akan muncul. Mari lihat beberapa contoh untuk memahami senario ralat ini.

Contoh 1:

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

int main() {
    Print("hello");
    return 0;
}

Dalam contoh ini, kami mentakrifkan fungsi cetakan umum Cetakan yang boleh mencetak sebarang jenis nilai. Dalam fungsi utama, kami memanggil fungsi Cetak dan lulus parameter rentetan. Tetapi pengkompil tidak dapat menyimpulkan jenis tertentu dan melaporkan ralat.

Contoh 2:

template<typename T>
T Max(T a, T b) {
    return a > b ? a : b;
}

int main() {
    cout << Max(3, 5.7) << endl;
    return 0;
}

Dalam contoh ini, kami mentakrifkan fungsi maksimum umum Maks, yang boleh mencari nilai maksimum bagi sebarang jenis nilai. Dalam fungsi utama, kami memanggil fungsi Max dan lulus integer dan parameter apungan. Tetapi pengkompil tidak dapat menyimpulkan jenis tertentu dan melaporkan ralat.

Dalam dua contoh di atas, pengkompil tidak boleh menyimpulkan jenis khusus kerana jenis ini berbeza, jadi ralat "Gagal diperoleh daripada berbilang ahli" akan berlaku.

Jadi bagaimana kita harus menyelesaikan masalah ini? Kita boleh mengambil pendekatan berikut:

  1. Tentukan secara eksplisit jenis parameter templat

Kita boleh menentukan secara eksplisit jenis parameter templat apabila memanggil fungsi atau kelas templat, supaya pengkompil boleh menyimpulkan contoh templat tertentu daripada jenis yang ditentukan. Contohnya:

Print<string>("hello"); // 明确指定T为string类型
cout << Max<int>(3, 5.7) << endl; // 明确指定T为int类型
  1. Menggunakan lebihan muatan

Kita boleh menulis pelaksanaan fungsi atau kelas templat ke dalam berbilang versi, setiap versi menyasarkan jenis data yang berbeza dan melakukan potongan jenis secara berasingan. Ini membebankan. Contohnya:

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

void Print(const char* value) {
    cout << string(value) << endl;
}

int main() {
    Print("hello"); // 调用重载版本的Print
    return 0;
}
  1. Menggunakan pengkhususan fungsi templat

Kami boleh menyediakan versi khusus fungsi atau kelas templat untuk jenis tertentu, supaya pengkompil boleh menggunakan versi khusus ini untuk potongan jenis. Contohnya:

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

template<>
void Print(const char* value) { // 为const char*类型提供特化版本
    cout << string(value) << endl;
}

int main() {
    Print("hello"); // 调用特化版本的Print
    return 0;
}

Ringkasan:

Apabila menggunakan templat dalam C++, ralat "derivasi templat gagal daripada berbilang ahli" adalah masalah biasa. Kita boleh mengambil beberapa langkah untuk menyelesaikan masalah ini, seperti menentukan jenis parameter templat secara eksplisit, menggunakan lebihan muatan dan menggunakan pengkhususan fungsi templat. Menguasai kemahiran ini akan membolehkan kami menggunakan templat C++ dengan lebih mahir dan menulis kod yang lebih fleksibel.

Atas ialah kandungan terperinci Ralat kompilasi C++: Derivasi templat gagal daripada berbilang ahli, bagaimana untuk menyelesaikannya?. 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