Bagikan melalui


Compiler Warning (level 1) C5208 dan Error C7626

kelas tanpa nama yang digunakan dalam nama typedef tidak dapat mendeklarasikan anggota selain anggota data non-statis, enumerasi anggota, atau kelas anggota

Keterangan

Kelas yang typedef tidak disebutkan namanya dalam deklarasi tidak boleh memiliki anggota selain:

  • anggota data non-statis tanpa penginisialisasi anggota default,
  • kelas anggota, atau
  • enumerasi anggota.

Batasan yang sama diterapkan secara rekursif ke setiap kelas bertumpuk. Batasan dimaksudkan untuk memastikan kesederhanaan struktur yang memiliki typedef nama untuk tujuan tautan. Nama harus cukup sederhana sehingga tidak ada penghitungan tautan yang diperlukan sebelum pengompilasi sampai ke nama typedef untuk tautan.

Peringatan ini baru di Visual Studio 2019 versi 16.6. Berdasarkan P1766R1 yang diadopsi oleh komite standar C++ sebagai laporan cacat, hal ini memengaruhi semua mode standar pengkompilasi. Dalam default /std:c++14 dan /std:c++17 mode, pengkompilasi memancarkan peringatan C5208 untuk kode yang tidak sesuai. Jika /permissive- ditentukan, pengkompilasi memancarkan peringatan C5208 sebagai kesalahan di bawah /std:c++14. Pengkompilasi memancarkan kesalahan C7626 untuk kode yang tidak sesuai ketika /std:c++17 atau yang lebih baru ditentukan.

Untuk menonaktifkan peringatan tanpa perubahan kode

Anda dapat menonaktifkan peringatan untuk baris kode tertentu dengan menggunakan warning pragma, #pragma warning(suppress : 5208). Anda juga dapat menonaktifkan peringatan dalam file dengan menggunakan pragma peringatan, #pragma warning(disable : 5208). Anda dapat menonaktifkan peringatan secara global dalam build baris perintah dengan menggunakan opsi baris perintah /wd5208 .

Untuk menonaktifkan peringatan untuk seluruh proyek di IDE Visual Studio:

  1. Buka dialog Halaman Properti untuk proyek Anda. Untuk informasi tentang cara menggunakan dialog Halaman Properti, lihat Halaman Properti.
  2. Pilih halaman Properti>Konfigurasi C/C++>Tingkat Lanjut.
  3. Edit properti Nonaktifkan Peringatan Tertentu untuk menambahkan 5208. Pilih OK untuk menerapkan perubahan Anda.

Contoh

Sampel berikut menunjukkan konstruksi yang tidak lagi diizinkan dalam struktur yang tidak disebutkan namanya. Tergantung pada mode standar yang ditentukan, kesalahan atau peringatan C5208 atau C7626 akan muncul:

struct Base { };
typedef struct : Base // inheriting from 'Base'; ill-formed
{
    void fn(); // ill-formed
    static int i; // ill-formed
    struct U {
        void f(); // nested class has non-data member; ill-formed
    };
    int j = 10; // default member initializer; ill-formed
} S;

Kode di atas dapat diperbaiki dengan memberi nama kelas yang tidak disebutkan namanya:

struct Base { };
typedef struct NamedType : Base
{
    void fn();
    static int i;
    struct U {
        void f();
    };
    int j = 10;
} S;