Как добавить wstring? - PullRequest
       2

Как добавить wstring?

9 голосов
/ 03 декабря 2010

Это работает с std :: string

std::string class::something(char* input) {
    std::string s(input);
    s = "hai! " + s;
    return s;
}

Но не получается, если я попробую то же самое с wstring

std::wstring class::something(wchar_t* input) {
    std::wstring s(input);
    s = "hai! " + s;
    return s;
}

Как мне сделать то же самое с std :: wstring?

Ответы [ 3 ]

15 голосов
/ 03 декабря 2010

Проблема здесь в типах. Wstring не является строкой, но к ней относится строковая константа в кавычках (обычно это const char*), поэтому

s = "hai! " + s;

на самом деле проблема.

Значение "hai! " имеет тип const char*, а не тип const wchar_t*. Поскольку const char* является базовым типом, он ищет глобальный operator+, который работает с const char* и wstring, который не существует. Он нашел бы один для const wchar_t* и wstring, потому что std::basic_string<T>, тип подчиненного шаблона для обоих string и wstring (используя char и wchar_t в качестве параметра типа соответственно) также создает методы шаблона для operator+ (const T*& s1, const basic_string<T> s2), чтобы сложение могло работать.

Поэтому вам нужно сделать "hai!" Строкой:

std::wstring class::something(wchar_t* input){
    std::wstring s(input);
    s = L"hai! " + s;
    return s;
}

Префикс L для строковой константы в Visual C ++ определяет ее как «long» и, следовательно, wstring. wstring на самом деле basic_string<wchar_t>, который из-за поведения шаблонов C ++ совершенно отличается от basic_string<char> (a std::string), поэтому вы не можете объединить их.

7 голосов
/ 03 декабря 2010

Вы используете литерал широкого символа вместо литерала символа char, добавляя префикс "hai!" с L.

0 голосов
/ 03 декабря 2010

Вместо двух версий кода (1 для широких и 1 для многобайтовых):

#ifdef _UNICODE
    typedef std::wstring tstring;
    typedef wchar_t tchar;
#   define TEXT(s) L##s
#else
    typedef std::string tstring;
    typedef char tchar;
#   define TEXT(s) s
#endif

tstring class::something(tchar* input) 
{
    tstring s(input);
    s = TEXT("hai! ") + s;
    return s;
}

Это предотвращает необходимость переписывать код, когда вы изменяете параметры компилятора строки кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...