Frage

Hallo auf diesen Code in Visual Studio 2008 kompilieren bekomme ich folgende Fehler

#include<iostream>
#include<string>
using namespace std;
void main()
{
     basic_string<wchar_t> abc("hello world");
     cout<<abc;
     return;
}

Fehler C2664: 'std :: basic_string <_Elem, _Traits, _AX> :: basic_string (std :: basic_string <_Elem, _Traits, _AX> :: _ Has_debug_it)': Konvertierung des Parameters 1 von ‚const char [12] 'to 'std :: basic_string <_Elem, _Traits, _AX> :: _ Has_debug_it'

Fehler C2679: binary '<<': fand keinen Operator, der einen rechten Operanden vom Typ 'std :: basic_string <_Elem, _Traits, _AX>' nimmt (oder es ist kein akzeptabler Umwandlung)

Was ist, dass ich falsch mache?

Kann jemand mir helfen, die Dinge zu verstehen hinter passiert? Dank

War es hilfreich?

Lösung

Wchar_t gibt breite Zeichentypen. Standardmäßig ist ein const char Zeiger auf eine Zeichenkette nicht breit, aber man kann dem Compiler sagen, es als ein großes Zeichenfeld zu behandeln, indem es mit ‚L‘ vorangestellt.

Also nur ändern

basic_string<wchar_t> abc(L"hello world");

Andere Tipps

Versuchen:

  

Fehler C2664:

basic_string<wchar_t> abc(L"hello world");
  

Fehler C2679:

cout << abc.c_str();

(Da der Compiler kann nicht / nicht eine geeignete Überlast für jeden Benutzer erstellt Typen liefern. Da jedoch auch dies ist ein Standardtyp dh wstring, sah ich die entsprechenden Header und fand keinen passenden operator<<, die entweder eine string nimmt oder ein wstring.)

und verwenden int main, so haben Sie:

int main(void)
{        
     basic_string<wchar_t> abc(L"hello world");
     cout << abc.c_str() << endl;
     return 0;
}

Obwohl, sollten Sie wirklich sein std::wstring anstelle das Rad neu zu erfinden.

Das Problem ist, dass Sie große Zeichen und (verengen?) Abmischen Charaktertypen.

Für Ihre basic_string, verwenden entweder:

// note the L"..." to make the literal wchar_t
basic_string<wchar_t> abc(L"hello world");  

// note that basic_string is no longer wchar_t
basic_string<char> abc("hello world");

oder das Äquivalent:

// wstring is just a typedef for basic_string<wchar_t>
wstring abc(L"hello world");

// string is just a typedef for basic_string<char>
string abc("hello world");

Und die Ausgabe ändern, um auch übereinstimmen:

cout << abc;   // if abc is basic_string<char>

wcout << abc;  // if abc is basic_string<wchar_t>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top