CString in std::string umwandeln geht nicht
-
Hallo zusammen,
nach etlichem Googeln und stundenlangem probieren, gebe ich bald auf. Ich schaffe es einfach nicht, einen CString einen std::string umzuwandeln. Ich habe hauptsächlich nur normale std::string Variablen. Der einzige Grund warum ich ein paar CString-Variablen habe ist, weil es Dialogvariablen sind für MFC. Es ist übrigens das abgespeckte Windows CE 5.0 MFC. Das kann so gut wie gar nichts finde ich. Jedenfalls habe ich folgendes versucht:
std::string test = (LPCTSTR)m_cstringVariable;
Ich erhalte folgenden Error:
cannot convert from 'const unsigned short *' to 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char
> >'
No constructor could take the source type, or constructor overload resolution was ambiguousWas könnte ich noch versuchen? Könnte es irgendwie mit GetBuffer() gehen?
Eigentlich will ich nur zwei Strings vergleichen. Leider sind sie unterschiedlichen Typs.
Grüße
Fresh
-
Er. Ich hab folgende Antwort geschrieben bevor mir aufgefallen ist dass du von "Windows CE 5.0" schreibst. Aber egal, wenn ichs schonmal geschrieben habe...
(Weiter unten mehr zum Them Windows CE 5.0)----
Wie aus der Fehlermeldung hervorgeht, sind deine
CString
s UTF-16 (wchar_t
bzw.unsigned short
). Undstd::string
ist dummerweise nicht UTF-16.Die einfachste Variante zwei solche String zu vergleichen ist den
std::string
in einenCString
zu konvertieren. Das geht nämlich netterweise trotz dem derCString
UTF-16 ist, der "narrow" String wird dabei automatisch mit der System-Codepage nach UTF-16 konvertiert.Wenn du das an mehreren Stellen brauchst, kannst du auch gleich passende operator == definieren:
inline bool operator == (std::string const& a, CString const& b) { return CString(a.c_str(), a.size()) == b; } inline bool operator == (CString const& a, std::string const& b) { return b == a; }
----
So, nu zum Thema "Windows CE 5.0".
Der Compiler für Windows CE 5.0 ist eMbedded Visual C++ 4.0.
Und wenn die Wikipedia-Seite zur MFC Recht hat, dann ist beim eMbedded Visual C++ 4.0 die MFC Version 6.0 dabei, also die selbe Version wie die von Visual Studio 6.0.In der gibt es den Konstruktor noch nicht den ich oben verwendet habe (
char*
+ Länge). Es gibt aber einen Konstruktor der nur einenchar*
nimmt (d.h. einfach die Länge, also dasa.size()
weglassen). Das funktioniert dann natürlich nicht mehr korrekt mit Strings die "eingebettete" Null-Characters haben. Da solche Strings aber ziemlich unüblich sind wirst du vielleicht damit leben können.Die Alternative wäre den String "zu Fuss" nach UTF-16 zu konvertieren. Unter Win32 nimmt man dafür
MultiByteToWideChar()
. Ob das unter Windows CE 5.0 auch verfügbar ist weiss ich allerdings nicht.