#include <algorithm>
#include <Windows.h>
int main()
{
int k = std::min(3, 4);
return 0;
}
Co robi Windows, jeśli dołączę Windows.h? Nie mogę używać std::min
w programie Visual Studio 2005. Komunikat o błędzie:
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
c++
visual-studio-2005
hidayat
źródło
źródło
Odpowiedzi:
windows.h
Plik nagłówka (lub bardziej poprawnie,windef.h
że zawiera z kolei) ma dla makrmin
imax
które zakłócają.Powinieneś
#define NOMINMAX
przed dołączeniem go.źródło
Nie musisz niczego definiować, po prostu pomiń makro, używając następującej składni:
źródło
min
lubmax
(przykład użycia: implementacja klasy, która pasuje do koncepcji UniformRandomNumberGenerator ).Jak wspominali inni, błędy wynikają z makr min / max, które są zdefiniowane w nagłówkach Windows. Istnieją trzy sposoby ich wyłączenia.
1)
#define NOMINMAX
przed dołączeniem nagłówka jest to ogólnie zła technika definiowania makr, aby wpływać na następujące nagłówki;2) zdefiniuj
NOMINMAX
w wierszu poleceń kompilatora / IDE. Zła część tej decyzji polega na tym, że jeśli chcesz wysłać swoje źródła, musisz ostrzec użytkowników, aby zrobili to samo;3) po prostu cofnij definicję makr w kodzie, zanim zostaną użyte
Jest to prawdopodobnie najbardziej przenośne i elastyczne rozwiązanie.
źródło
Nadal mam czasami problemy z nagłówkami systemu Windows, a definicja NOMINMAX w całym projekcie nie zawsze działa. Zamiast używać nawiasów, czasami określam typ jawnie w następujący sposób:
To również zapobiega dopasowywaniu się preprocesora do
min
i jest prawdopodobnie bardziej czytelne niż obejście z nawiasami.źródło
Spróbuj czegoś takiego:
Domyślnie windows.h definiuje
min
imax
jako makra. Kiedy te zostaną rozwinięte, kod, który próbuje użyćstd::min
(na przykład), będzie wyglądał mniej więcej tak:Komunikat o błędzie informuje, że
std::(x)
nie jest to dozwolone.źródło
W moim przypadku projekt nie zawierał
windows.h
aniwindef.h
wyraźnie. Używał Boost. Tak, problem został rozwiązany, przechodząc do projektuProperties -> C/C++ -> Preprocessor
, a dodanieNOMINMAX
wPreprocessor Definitions
(VS 2013, VS 2015).źródło
Dla osób, które zawierają windows.h, umieść następujące nagłówki:
W plikach źródłowych tylko #undef min i max.
źródło
jest sztuczką polegającą na pomijaniu definicji makr max i min
http://support.microsoft.com/kb/143208
źródło
Aby rozwiązać ten problem, po prostu utworzę plik nagłówkowy o nazwie
fix_minmax.h
bez włączonych zabezpieczeńPodstawowe użycie jest takie.
Zaletą tego podejścia jest to, że działa z każdym rodzajem dołączonego pliku lub części kodu. Oszczędza to również czas podczas pracy z kodem lub bibliotekami zależnymi od
min
/max
macrosźródło
Zakładam, że windows.h definiuje min jako makro, np. Jak
To wyjaśniałoby komunikat o błędzie.
źródło