Rumah > pembangunan bahagian belakang > C++ > Mengapakah GCC dan Clang Melemparkan \'Pemula Ahli Lalai Diperlukan\' Apabila Menggunakan Kelas sebagai Argumen Lalai?

Mengapakah GCC dan Clang Melemparkan \'Pemula Ahli Lalai Diperlukan\' Apabila Menggunakan Kelas sebagai Argumen Lalai?

Barbara Streisand
Lepaskan: 2024-10-26 10:49:02
asal
579 orang telah melayarinya

Why Does GCC and Clang Throw

Memahami Ralat Penyusun: "Pemula Ahli Lalai Diperlukan Sebelum Tamat Kelas Terlampirnya"

Isu ini timbul apabila cuba mentakrifkan pemula ahli lalai untuk ahli kelas dalam fungsi yang menggunakan kelas itu sebagai nilai argumen lalai. Pengkompil seperti gcc dan clang menghadapi kesukaran dengan binaan ini, manakala msvc2017 mengendalikannya dengan jayanya.

Pertimbangkan coretan kod berikut:

<code class="cpp">class Downloader
{
public:
    struct Hints
    {       
        int32_t numOfMaxEasyHandles = 8;
    };

    static Downloader *Create(const Hints &amp;hints = Hints());
};</code>
Salin selepas log masuk

Kod yang disediakan bertujuan untuk menentukan nilai lalai untuk numOfMaxEasyHandles ahli struct Petunjuk, yang digunakan sebagai hujah lalai dalam fungsi Cipta. Walau bagaimanapun, gcc dan clang gagal untuk menyusun kod ini, mengeluarkan ralat:

default member initializer for 'Downloader::Hints::numOfMaxEasyHandles' required before the end of its enclosing class
Salin selepas log masuk

Sebab Ralat

Ralat ini berlaku disebabkan oleh pepijat dalam gcc dan dentang yang berkaitan dengan pengendalian pemula ahli lalai dalam kelas yang digunakan sebagai argumen lalai dalam fungsi. Penyusun mengharapkan pemula ahli lalai ditakrifkan dalam definisi kelas itu sendiri, bukannya dalam badan fungsi.

Penyelesaian Kemungkinan

Untuk menyelesaikan isu ini, terdapat dua penyelesaian yang berpotensi:

  1. Petua Nyahkomen(){}: Menambah pembina kosong pada struct Petunjuk mengurangkan ralat pengkompil. Walau bagaimanapun, pendekatan ini mungkin tidak diingini kerana ia mengalahkan tujuan mempunyai pemula ahli lalai.
  2. Menggunakan Petunjuk() = lalai: Pernyataan ini secara eksplisit mentakrifkan pembina lalai untuk struct Petunjuk . Walaupun ia menghapuskan ralat pengkompil dalam msvc2017, ia menjadikan kod itu tidak serasi dengan gcc dan clang disebabkan oleh pepijat yang disebutkan di atas.

Atas ialah kandungan terperinci Mengapakah GCC dan Clang Melemparkan \'Pemula Ahli Lalai Diperlukan\' Apabila Menggunakan Kelas sebagai Argumen Lalai?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan