wstring2string
-
Ich habe den Header locale.h eingebunden. Die Fehlermeldung ist jetzt das 3 Argumente antatt 1 erwartet wird. Soweit ich zählen kann übergebe ich aber 3 Argumente. Was ist der Fehler?
#include <locale> void wstring2string(std::string &dest,const std::wstring &src) { const wchar_t *Widen = src.c_str(); char *Narrow = new char[src.length()+1]; // Diese Zeile mird angemeckert: std::use_facet<std::ctype<wchar_t> > (std::cout.getloc()).narrow(*Widen, *Widen + src.length(), '?', Narrow); //_USE(cout.getloc(), ctype<wchar_t>).narrow(*Widen, *Widen + src.length(), '?', Narrow); } // error C2780: 'const _F &__cdecl std::use_facet(const class std::locale &,const _F *,bool)' // : expects 3 arguments - 1 provided
-
Hi!
Hab da vorhin mal 2 Funktionen erstellt, die sollten funktionieren:
std::string wstring2string(std::wstring const &str, std::locale const &loc=std::locale()) { size_t len = str.size(); char *tmp = new char[len+1]; std::use_facet<std::ctype<wchar_t> >(loc).narrow(str.data(), str.data()+len, '?', tmp); tmp[len] = 0; std::string res(tmp); delete []tmp; return res; } std::wstring string2wstring(std::string const &str, std::locale const &loc=std::locale()) { size_t len = str.size(); wchar_t *tmp = new wchar_t[len+1]; std::use_facet<std::ctype<wchar_t> >(loc).widen(str.data(), str.data()+len, tmp); tmp[len] = 0; std::wstring res(tmp); delete []tmp; return res; }Wahrscheinlich hast du kein "using namespace std;" bei dir im Programm, weshalb use_facet nicht gefunden wird, liegt nämlich auch (wie eigentlich alles in C++) im Namespace std.
Aufrufen kannst du das ganze von mir etwa so:std::string str = wstring2string(L"Hallo", std::cout.getloc()); // oder ohne zweiten Parameter std::wstring wstr = string2wstring(str, std::cout.getloc()); // oder ohne zweiten Parameter std::cout << str << std::endl; std::wcout << wstr << std::endl;Greetz
-
Man sollte übrigens noch erwähnen, dass die StdLib selbst keinerlei Konvertierung von einem Zeichensatz in einen anderen vornimmt.
Wer das braucht benötigt eine zusätzliche Bibliothek (z.B. von Dinkumware).
-
Hallo Vellas,
erstmal vielen Dank das Du Dir Mühe gemacht hast

Der Fehler ist aber noch immer vorhanden: Ich erstelle ein neues VS6 Kommandozeilen Projekt und kopiere diesen Source rein:#include "stdafx.h" #include <locale> using namespace std; std::string wstring2string(std::wstring const &str, std::locale const &loc=std::locale()) { size_t len = str.size(); char *tmp = new char[len+1]; std::use_facet<std::ctype<wchar_t> >(loc).narrow(str.data(), str.data()+len, '?', tmp); tmp[len] = 0; std::string res(tmp); delete []tmp; return res; } int main(int argc, char* argv[]) { printf("Hello World!\n"); return 0; }Als Fehlermeldung bekomme ich:
error C2780: 'const _F &__cdecl std::use_facet(const class std::locale &,const _F *,bool)' : expects 3 arguments - 1 provided
c:\program files\microsoft visual studio\vc98\include\xlocale(157) : see declaration of 'use_facet'
error C2228: left of '.narrow' must have class/struct/union type@Lolz: Eine extra DLL wollte ich nicht einbinden.
-
Das scheint ein Problem deines VC6 zu sein. Bei dir will der Konstruktor von use_facet 3 Parameter. Laut Standard (und in deinem Code) wird aber nur ein Parameter benötigt.
Kannst du nicht einen aktuelleren Compiler nehmen (VC2005 oder so)?
-
Ich glaub das liegt am VS6, schau dir mal die Dokumentation zu std::use_facet an (in der msdn version die beim vs6 dabei war). Scheinbar muss man in dieser Version noch zusätzliche Parameter mitangeben.
-
Ich habe hier was dazu gefunden. Ist aber französisch.

http://www.developpez.net/forums/archive/index.php/t-19922.html
Ich interpretiere das mal so, dass das hier gehen müsstestd::use_facet<std::ctype<wchar_t> >(loc, 0, true).narrow(str.data(), str.data()+len, '?', tmp);
-
Naja, das VS6 benutzen hier noch alle. Da bleibe ich erstmal bei diesem Projektformat.
@Braunstein: Das hat genau hingehauen. Vielen Dank

-
Alle springen von der Brücke. Die springst hinterher.
-
Mag sein das VS6 veraltet ist, aber so erspare ich mir Ärger in der Firma. Wie man an diesem Fall sieht sind nicht nur die Projektdateien anders, sondern auch der C++ Code. Die Kollegen würden mich von der Brücke stoßen wenn ich für VS6 nicht kompilierbaren Code verteilen würde. Und als Werkstudent habe ich eh keinen grossen Einfluß um einen Umstieg auf .Net Studio zu erzwingen...
-
In dem Fall würd ich aber doch eher zum _USE Makro tendieren.