Pregunta

Hola, al compilar este código en Visual Studio 2008, aparece el siguiente error.

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

error C2664:'std::basic_string<_Elem,_Rasgos,_Ax>::basic_string(std::basic_string<_Elem,_Rasgos,_Ax>::_Has_debug_it)' :no se puede convertir el parámetro 1 de 'const char [12]' a 'std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it'

error C2679:binario '<<':no se encontró ningún operador que tome un operando de la derecha de tipo 'std::basic_string<_Elem,_Traits,_Ax>' (o no hay una conversión aceptable)

¿Qué es lo que estoy haciendo mal?

¿Alguien puede ayudarme a comprender las cosas que suceden detrás?Gracias

¿Fue útil?

Solución

wchar_t especifica los tipos de caracteres anchos. Por defecto, un puntero const char a una cadena literal no es amplia, pero se puede decir que el compilador para tratarla como una amplia gama de caracteres prefijándolo con 'L'.

Así que basta con cambiar a

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

Otros consejos

Probar:

  

C2664 de error:

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

C2679 de error:

cout << abc.c_str();

(Desde el compilador puede no / no proporcionará una sobrecarga adecuado para cada tipo de usuario creado. Sin embargo, ya que este es también un tipo estándar, es decir wstring, miré hacia arriba las cabeceras apropiadas y no encontró operator<< adecuado que lleva ya sea un string o un wstring.)

y utilizar int main, por lo que tiene:

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

Aunque, en realidad debería ser el uso de std::wstring en lugar de reinventar la rueda.

El problema es que va a mezclar caracteres de ancho y (estrecho?) Tipos de caracteres.

Para su basic_string, utilice:

// 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");

o el equivalente:

// 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");

Y cambiar la salida para que coincida también:

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

wcout << abc;  // if abc is basic_string<wchar_t>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top