Warum ::
notwendig ist: Der Standard definiert zwei tolower
,
eine Funktionsvorlage in std::
und eine einfache Funktion in ::
und
%Code%. Abhängig davon, welche Header enthalten sind (und das beinhaltet
Header, die indirekt von anderen Headern enthalten sind, die Sie möglicherweise nicht kennen
etwa), entweder der eine oder der andere oder beide können sichtbar sein. Die Verwendung von std::
stellt sicher
dass der ältere, vom C-Standard, verwendet wird. (Wenn der in ::
wird betrachtet, der Aufruf wird mehrdeutig sein, da die Transformation eine Vorlage ist
selbst, und der Compiler kann die Vorlage nicht ableiten
Argumente.)
Wenn ich schon dabei bin, könnte ich erwähnen, dass std::
so ist
undefiniertes Verhalten, zumindest wenn das einfache Zeichen signiert ist. Die Eingabe zu
::tolower
ist ein int und muss im Bereich ::tolower
... 0
oder UCHAR_MAX
liegen. Ob
Plain Char ist signiert, einige der Zeichen können negativ sein
Codierungen, die zu undefiniertem Verhalten führen. In der Praxis die meisten
Implementierungen machen das funktioniert. Für alle Charaktere außer EOF
(ÿ in
Latein 1). Wenn Sie sich nicht mit Portabilität befassen, haben einige Compiler
ein Schalter, um Char ohne Vorzeichen zu machen --- benutze es. Ansonsten schreibe einen kleinen
Funktionsobjekt, um es richtig zu behandeln, entweder:
oder (besser, aber wesentlich mehr Arbeit --- nur wert, wenn Sie es benutzen
viel), ein funktionales Objekt, dessen Konstruktor ein Gebietsschema (defaulting
zum globalen Gebietsschema) und enthält einen Verweis auf ein 0xFF
, das
Es wird für die Funktion std::ctype
verwendet. (Natürlich, wenn du wirklich bist
internationalisiert hat tolower
wahrscheinlich keine Bedeutung. Und
Sie werden UTF-8 verwenden, eine Multi-Byte-Codierung, und funktioniert nicht
mit einer der verfügbaren Möglichkeiten.)
Verwenden Sie die Version aus dem globalen Namespace. (Wahrscheinlich <ctypes.h>
und nicht <cctypes>
wenn std::
nicht funktioniert)
Tags und Links string c++ stl scope-resolution