Bagikan melalui


Compiler Error C2397

konversi dari 'type_1' ke 'type_2' memerlukan konversi yang menyempit

Konversi penyempitan implisit ditemukan saat menggunakan inisialisasi seragam.

Bahasa C memungkinkan konversi implisit yang menyempit dalam penugasan dan inisialisasi, dan sesuai dengan C++, meskipun penyempitan yang tidak terduga adalah penyebab banyak kesalahan kode. Untuk membuat kode lebih aman, standar C++ memerlukan pesan diagnostik saat konversi yang mempersempit terjadi dalam daftar inisialisasi. Di Visual C++, diagnostiknya adalah Compiler Error C2397 saat menggunakan sintaks inisialisasi seragam yang didukung mulai visual Studio 2015. Pengkompilasi menghasilkan Compiler Warning (tingkat 1) C4838 saat menggunakan daftar atau sintaks inisialisasi agregat yang didukung oleh Visual Studio 2013.

Konversi yang dipersempit bisa baik-baik saja ketika Anda tahu kemungkinan rentang nilai yang dikonversi dapat sesuai dengan target. Dalam hal ini, Anda tahu lebih dari kompiler. Jika Anda sengaja membuat konversi yang mempersempit, buat niat Anda eksplisit dengan menggunakan pemeran statis. Jika tidak, pesan kesalahan ini hampir selalu menunjukkan bahwa Anda memiliki bug dalam kode Anda. Anda dapat memperbaikinya dengan memastikan objek yang Anda inisialisasi memiliki jenis yang cukup besar untuk menangani input.

Sampel berikut menghasilkan C2397:

// C2397.cpp
// compile with: /c
struct S {
   int m1;
   double m2, m3;
};

void func(double d1) {
   char c1 { 127 };   // OK
   char c2 { 513 };   // C2397
   
   S arr[2]{};
   arr[0] = { d1, 2.0, 3.0 };   // C2397
   arr[1] = { static_cast<int>(d1), 2.0, 3.0 };   // OK
}