El problema aquí es tipos. Un wstring no es una cadena, pero una constante de cadena entre comillas se relaciona con ella (por lo general es un const char*
), por lo
s = "hai! " + s;
es en realidad un problema.
El valor "hai! "
es del tipo const char*
, no el tipo const wchar_t*
. Como const char*
es un tipo básico, está buscando un operator+
global que opere const char*
y wstring
, que no existe. Encontraría uno para const wchar_t*
y wstring
, porque std::basic_string<T>
, the template underyling type for both string
and wstring
(usando char
y wchar_t
como parámetro de tipo, respectivamente) también crea métodos de plantilla para operator+ (const T*& s1, const basic_string<T> s2)
para que la adición pueda funcionar.
Por lo tanto, es necesario hacer una wstring "Hai!":
std::wstring class::something(wchar_t* input){
std::wstring s(input);
s = L"hai! " + s;
return s;
}
El L
prefijo en una constante de cadena, en Visual C++, define que sea "larga", y por lo tanto un wstring. wstring
is actually basic_string<wchar_t>
, que es, debido al comportamiento de las plantillas C++, un tipo completamente diferente de basic_string<char>
(a std::string
), por lo que no puede combinar los dos.
"El valor" hai! "es de tipo std :: string ..." es una afirmación incorrecta. El tipo real es 'char const *'. "El prefijo L en una constante de cadena, en Visual C++, lo define como" largo "y, por lo tanto, un wstring" también es incorrecto de tres maneras. Primero, no es específico de VC++. Segundo, lo define como "ancho", no "largo". En tercer lugar, no es un wstring, es un 'wchar_t const *'. –
Bastante correcto. Me di cuenta de esto mientras escribías el comentario y editabas mi respuesta al mismo tiempo. Aunque pensé que era una const wchar_t const *, no solo una wchar_t const *? Que inexactamente escribí como const wchar_t *, faltando el segundo const, pero no estoy seguro de querer editarlo nuevamente para corregir eso, ahora que estoy equivocado en lugar de estar flagrantemente equivocado. –