#include <algorithm>
#include <Windows.h>
int main()
{
int k = std::min(3, 4);
return 0;
}
Apa yang dilakukan windows jika saya menyertakan Windows.h? Saya tidak dapat menggunakan std::min
di visual studio 2005. Pesan kesalahannya adalah:
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
c++
visual-studio-2005
hidayat
sumber
sumber
Jawaban:
File
windows.h
header (atau lebih tepatnya,windef.h
yang disertakan pada gilirannya) memiliki makromin
danmax
yang mengganggu.Anda harus
#define NOMINMAX
sebelum memasukkannya.sumber
Tidak perlu mendefinisikan apa pun, cukup lewati makro menggunakan sintaks ini:
sumber
min
ataumax
(contoh kasus penggunaan: mengimplementasikan kelas yang sesuai dengan konsep UniformRandomNumberGenerator ).Seperti yang disebutkan orang lain, kesalahan disebabkan oleh makro min / maks yang ditentukan di header windows. Ada tiga cara untuk menonaktifkannya.
1)
#define NOMINMAX
sebelum menyertakan tajuk, ini biasanya merupakan teknik yang buruk dalam menentukan makro untuk memengaruhi tajuk berikut;2) tentukan
NOMINMAX
dalam baris perintah kompiler / IDE. Bagian buruk dari keputusan ini adalah jika Anda ingin mengirimkan sumber Anda, Anda perlu memperingatkan pengguna untuk melakukan hal yang sama;3) cukup batalkan definisi makro dalam kode Anda sebelum digunakan
Ini mungkin solusi yang paling portabel dan fleksibel.
sumber
Saya kadang-kadang masih mengalami masalah dengan header windows dan proyek NOMINMAX sepertinya tidak selalu berfungsi. Sebagai alternatif untuk menggunakan tanda kurung, saya terkadang membuat jenisnya eksplisit seperti:
Ini juga menghentikan preprocessor agar tidak mencocokkan ke
min
dan bisa dibilang lebih mudah dibaca daripada penyelesaian masalah dengan tanda kurung.sumber
Coba sesuatu seperti ini:
Secara default, windows.h mendefinisikan
min
danmax
sebagai makro. Ketika itu diperluas, kode yang mencoba digunakanstd::min
(misalnya) akan terlihat seperti ini:Pesan kesalahan memberi tahu Anda bahwa
std::(x)
itu tidak diperbolehkan.sumber
Dalam kasus saya, proyek tidak menyertakan
windows.h
atauwindef.h
secara eksplisit. Itu menggunakan Boost. Jadi, saya menyelesaikan masalah dengan pergi ke proyekProperties -> C/C++ -> Preprocessor
, dan menambahkanNOMINMAX
dalamPreprocessor Definitions
(VS 2013, VS 2015).sumber
Untuk orang-orang termasuk windows.h, tempatkan yang berikut ini di header yang terpengaruh:
Dalam file sumber, cukup #undef min dan max.
sumber
adalah trik untuk menekan definisi makro maks dan min
http://support.microsoft.com/kb/143208
sumber
Untuk mengatasi masalah ini saya hanya membuat file header bernama
fix_minmax.h
tanpa menyertakan penjagaPenggunaan dasar seperti ini.
Kelebihan dari pendekatan ini adalah ia bekerja dengan setiap jenis file atau bagian kode yang disertakan. Ini juga menghemat waktu Anda saat berurusan dengan kode atau pustaka yang bergantung pada
min
/max
macrosumber
Saya akan berasumsi windows.h mendefinisikan min sebagai makro, misalnya seperti
Itu akan menjelaskan pesan kesalahannya.
sumber