Как мне объединить строки?

#c 11

Вопрос:

Я хочу использовать следующий код:

 wstring s = L"GetLockCount "   g_SpeakerAlias.c_str();
MessageBoxW(NULL, unsignedinttowstring(iLockCount).c_str(), s, MB_OK);
 

Компилятор говорит мне:

 The expression must have an integer enumeration type or an enumeration type without range restriction   
 

То, как я пытаюсь соединить 2 струны, кажется неправильным:

 L"GetLockCount "   g_SpeakerAlias.c_str()
 

Вот декларация:

 wstring  g_SpeakerAlias=L"SomeName";
 

Комментарии:

1. Обратите внимание, что вместо unsignedinttowstring этого вы можете использовать std::to_wstring

Ответ №1:

.c_str() не является необходимым для объединения. Вам это нужно только в MessageBoxW, так как он ожидает LPCWSTR.

Это правильно:

 wstring s = L"GetLockCount "   g_SpeakerAlias;
MessageBoxW(NULL, unsignedinttowstring(iLockCount).c_str(), s.c_str(), MB_OK);
 

Чтобы быть ясным, причина, по которой это работает, заключается в том, что, хотя L»GetLockCount» не является строкой wstring (это строковый литерал в стиле C с широким символом, который не является строкой C ), g_SpeakerAlias является строкой wstring, и для оператора существует перегрузка, где левая сторона-это wchar_t*, а правая-это строка wstring, которая создает другую строку wstring. При вызове .c_str () происходит сбой, потому что нет перегрузки, покрывающей wchar_t* wchar_t*. Другим решением было бы выполнить wstring s = L»GetLockCount «;, затем продолжить с помощью s = g_SpeakerAlias;; wstring строит из литерала, затем объединяет.

Комментарии:

1. Чтобы было ясно, причина, по которой это работает, заключается в том, что , хотя L"GetLockCount " это не a wstring (это широкосимвольный строковый литерал в стиле C, который не является C wstring ), g_SpeakerAlias это a wstring , и существует перегрузка для operator того, где левая сторона-a wchar_t* , а правая-a wstring , которая создает другую wstring . Когда вы звоните .c_str() , он выходит из строя, потому что нет покрытия перегрузки wchar_t* wchar_t* . Другим решением было бы сделать wstring s = L"GetLockCount "; , s = g_SpeakerAlias; а wstring затем продолжить ; конструкции из буквального, а затем объединить.

2. @ShadowRanger, Вы позволите мне вставить ваш комментарий в мой ответ? Или, если нет, вы можете с радостью опубликовать свой комментарий в качестве ответа.

3. Продолжайте и добавьте его. Сохраняйте то, что вам нравится, перефразируйте, что угодно; важная часть заключается в том, что ОП знает, почему это не сработало и почему изменение заставляет его работать, чтобы в будущем они могли решить проблему логикой, а не программированием культа карго.