error c2664 al usar basic_string<wchar_t> abc(“hola”) en vc++ 9.0
-
22-08-2019 - |
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
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>